Kết hợp $exists, $not và $elemMatch
Để tìm document mà tất cả phần tử trong mảng đều thỏa mãn điều kiện, sử dụng logic phủ định: không tồn tại phần tử nào vi phạm điều kiện.
Dữ liệu điểm số
> db.demo15.insertOne({"Details": [{"Score": 56}, {"Score": 78}]});
> db.demo15.insertOne({"Details": [{"Score": 86}, {"Score": 86}]});
> db.demo15.insertOne({"Details": [{"Score": 97}, {"Score": 85}]});
Tìm document có TẤT CẢ Score = 86
> db.demo15.find({
"Details.Score": { $exists: true },
"Details": {
$not: {
$elemMatch: {
"Score": { $ne: 86 }
}
}
}
});
Kết quả
{ "_id": ObjectId("..."), "Details": [{ "Score": 86 }, { "Score": 86 }] }
Giải thích logic:
$elemMatchtìm phần tử có Score ≠ 86$notphủ định: không có phần tử nào Score ≠ 86$exists: trueđảm bảo mảng không rỗng
Cách này hiệu quả hơn so với duyệt từng phần tử ở ứng dụng.