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 ý
$orkhông thể lồng trực tiếp trong$andngượ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"] } }.