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

MongoDB $elemMatch ใน Projection เพื่อดึง Element ที่ Match เท่านั้น

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)