ใช้ $elemMatch ร่วมกับ $and เพื่อค้นหาเอกสารที่อาร์เรย์มีค่าตรงตามหลายเงื่อนไขพร้อมกัน เริ่มต้นด้วยการสร้างคอลเลกชันตัวอย่าง:
> db.findDocumentsHaving2Demo.insertOne({_id : 101, Values: [78,98]});
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsHaving2Demo.insertOne({_id :102, Values : [89,102]});
{ "acknowledged" : true, "insertedId" : 102 }
แสดงเอกสาร:
> db.findDocumentsHaving2Demo.find().pretty();
คิวรี่ค้นหาเอกสารที่:
- มีค่าอยู่ระหว่าง 77-78 (รวม)
- มีค่าอยู่ระหว่าง 90-110 (รวม)
- ไม่มีค่าที่ 3 (index 2)
> db.findDocumentsHaving2Demo.find({$and: [ {Values: {$elemMatch: {$gte: 77, $lte: 78}}}, {Values: {$elemMatch: {$gte: 90, $lte: 110}}}, {'Values.2': {$exists: false}} ]})คำอธิบาย:
- แต่ละ
$elemMatchตรวจสอบว่า มีอย่างน้อย 1 ค่า ในอาร์เรย์ตรงเงื่อนไข $andรวมเงื่อนไขทั้งหมด ต้องตรงทุกอย่าง'Values.2': {$exists: false}- ตรวจสอบว่าไม่มี index 2 (ค่าที่ 3)
เอกสาร _id:101 ผ่านเพราะ มี 78 (ในช่วง 77-78), มี 98 (ในช่วง 90-110), และมีแค่ 2 ค่า