Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Triển khai truy vấn $or trong MongoDB

Toán tử $or thực hiện logic **OR** trên nhiều điều kiện (có thể trên các field khác nhau). Trả về document thỏa **ÍT NHẤT MỘT** điều kiện.

Cú pháp

db.collection.find({
    $or: [
        { "trường1": giáTrị1 },
        { "trường2": giáTrị2 },
        ...
    ]
}).pretty();

Ví dụ minh họa

Tạo collection orDemo:

> db.orDemo.insertOne({ "UserName": "Larry", "UserAge": 23 });
> db.orDemo.insertOne({ "UserName": "David", "UserAge": 21 });
> db.orDemo.insertOne({ "UserName": "Mike", "UserAge": 25 });
> db.orDemo.insertOne({ "UserName": "Sam", "UserAge": 20 });
> db.orDemo.insertOne({ "UserName": "Carol", "UserAge": 24 });
> db.orDemo.insertOne({ "UserName": "Bob", "UserAge": 22 });

Hiển thị tất cả:

> db.orDemo.find().pretty();

Truy vấn: UserName là "Carol" HOẶC "Larry"

> db.orDemo.find({ $or: [ { "UserName": "Carol" }, { "UserName": "Larry" } ] }).pretty();

Kết quả:

{ "_id" : ..., "UserName" : "Larry", "UserAge" : 23 }
{ "_id" : "..." , "UserName" : "Carol", "UserAge" : 24 }

Kết hợp $or với các toán tử khác

// UserName = "Carol" HOẶC UserAge > 25
db.orDemo.find({
    $or: [
        { "UserName": "Carol" },
        { "UserAge": { $gt: 25 } }
    ]
});

$or vs $in (trên cùng một field)

  • { $or: [ { status: "A" }, { status: "B" } ] }
  • { status: { $in: ["A", "B"] } } **→ Khuyên dùng $in (hiệu quả hơn, dùng index tốt hơn).**

$or trên các field khác nhau (bắt buộc dùng $or)

// Tên là "John" HOẶC Tuổi > 30
db.users.find({
    $or: [
        { "name": "John" },
        { "age": { $gt: 30 } }
    ]
});

Hiệu suất & Index

  • Mỗi điều kiện trong $or nên có index riêng để MongoDB dùng **index intersection** hoặc chạy song song.
  • Nếu không có index, $or sẽ quét collection (COLLSCAN) cho từng clause.
  • Giới hạn: Mỗi clause trong $or nên selective (lọc bớt nhiều document).

Lưu ý

  • $or không thể lồng trực tiếp trong $and ngược lại (nhưng có thể lồng $and trong $or).
  • Với mảng: { $or: [ { "tags": "a" }, { "tags": "b" } ] } tương đương { tags: { $in: ["a","b"] } }.