Operator $elemMatch ในส่วนของ Projection (Field Selection) ใช้สำหรับคืนค่าเฉพาะ Element แรกใน Array ที่ Match เงื่อนไข เนื้อหานี้สาธิตการ Query เอกสาร _id: 101 และ Project เฉพาะ Element ใน details ที่ Age = 22
ตัวอย่างข้อมูลทดสอบ
> db.demo313.insertOne({"_id":100,"details":[{"Name":"Chris","Age":24}]});
{ "acknowledged" : true, "insertedId" : 100 }
> db.demo313.insertOne({"_id":101,"details":[{"Name":"David","Age":22}]});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo313.insertOne({"_id":102,"details":[{"Name":"Mike","Age":25}]});
{ "acknowledged" : true, "insertedId" : 102 }
แสดงข้อมูลทั้งหมด
> db.demo313.find();
{
"_id" : 100,
"details" : [ { "Name" : "Chris", "Age" : 24 } ]
}
{
"_id" : 101,
"details" : [ { "Name" : "David", "Age" : 22 } ]
}
{
"_id" : 102,
"details" : [ { "Name" : "Mike", "Age" : 25 } ]
}
Query ใช้ $elemMatch ใน Projection
db.demo313.find(
{_id:101},
{details: { $elemMatch: { Age: 22 } } }
);
ผลลัพธ์
{
"_id" : 101,
"details" : [ { "Name" : "David", "Age" : 22 } ]
}
คำอธิบาย
- Filter:
{_id:101}เลือกเอกสาร - Projection:
{details: { $elemMatch: { Age: 22 } }}- คืนเฉพาะ Element แรกใน details ที่ Age=22 - แตกต่างจาก Filter $elemMatch: Projection $elemMatch คืน Element เดียว (First Match) ใน Array
- กรณี Array มีหลาย Element Match: จะคืนแค่ตัวแรกตามลำดับ
- หากต้องการคืนหลาย Element ใช้ Aggregation
$filterแทน - ใช้ได้กับ Array of Objects (Embedded Documents)