ใช้ $elemMatch ร่วมกับ $not และ $ne เพื่อหาเอกสารที่สมาชิกทุกตัวในอาร์เรย์มีค่าเท่ากับค่าที่กำหนด สร้างคอลเลกชันตัวอย่าง:
> db.demo15.insertOne({"Details":[{"Score":56},{"Score":78}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e0f7806d7df943a7cec4fab") }
> db.demo15.insertOne({"Details":[{"Score":86},{"Score":86}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e0f7817d7df943a7cec4fac") }
> db.demo15.insertOne({"Details":[{"Score":97},{"Score":85}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e0f7823d7df943a7cec4fad") }
แสดงข้อมูลทั้งหมด:
> db.demo15.find();
ผลลัพธ์:
{ "_id" : ObjectId("5e0f7806d7df943a7cec4fab"), "Details" : [ { "Score" : 56 }, { "Score" : 78 } ] }
{ "_id" : ObjectId("5e0f7817d7df943a7cec4fac"), "Details" : [ { "Score" : 86 }, { "Score" : 86 } ] }
{ "_id" : ObjectId("5e0f7823d7df943a7cec4fad"), "Details" : [ { "Score" : 97 }, { "Score" : 85 } ] }
คิวรีหาเอกสารที่ ทุก สมาชิกในอาร์เรย์ Details มี Score เท่ากับ 86:
> db.demo15.find({
"Details.Score" : { $exists : true },
"Details" : {
$not : {
$elemMatch : {
"Score" : { $ne : 86 }
}
}
}
});
ผลลัพธ์ (ได้เฉพาะเอกสารที่ 2):
{ "_id" : ObjectId("5e0f7817d7df943a7cec4fac"), "Details" : [ { "Score" : 86 }, { "Score" : 86 } ] }
หลักการทำงาน
$elemMatchจับคู่สมาชิกในอาร์เรย์ที่ตรงเงื่อนไข$ne: 86หาสมาชิกที่ ไม่ใช่ 86$notนิราคการจับคู่ → หมายถึง "ไม่มีสมาชิกไหนที่ไม่ใช่ 86" = "ทุกตัวเป็น 86"Details.Score: {$exists: true}กรองเอกสารที่มีฟิลด์ Score อยู่จริง