Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ค้นหาเอกสาร MongoDB ที่สมาชิกในอาร์เรย์มีค่าเฉพาะ

ใช้ $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 อยู่จริง