ใช้ find() ร่วมกับ Projection (การฉาย) และ Positional Operator $ เพื่อดึงเฉพาะ Sub-document ที่ตรงเงื่อนไข
ตัวอย่างข้อมูลทดสอบ
> db.demo37.insertOne({"Details":[{"Name":"Chris","Age":21},{"Name":"David","Age":23}]});
> db.demo37.insertOne({"Details":[{"Name":"Sam","Age":23},{"Name":"Robert","Age":25}]});
แสดงข้อมูลทั้งหมด
> db.demo37.find();
{
"_id" : ObjectId("5e176635cfb11e5c34d898d7"),
"Details" : [ {"Name" : "Chris", "Age" : 21}, {"Name" : "David", "Age" : 23} ]
}
{
"_id" : ObjectId("5e17664acfb11e5c34d898d8"),
"Details" : [ {"Name" : "Sam", "Age" : 23}, {"Name" : "Robert", "Age" : 25} ]
}
คิวรี่เลือก Sub-document ที่ Name = "Sam" (ไม่เอา _id, เอาเฉพาะ Details.$.Name)
> db.demo37.find({'Details.Name' : 'Sam'},{_id: 0, 'Details.$.Name': 1});
ผลลัพธ์
{
"Details" : [ {"Name" : "Sam", "Age" : 23} ]
}
คำอธิบาย:
- เงื่อนไข
'Details.Name' : 'Sam'ค้นหาเอกสารที่อาร์เรย์ Details มี Name = Sam - Projection
{_id: 0, 'Details.$.Name': 1}ซ่อน _id และแสดงเฉพาะ Sub-document แรกที่ตรงเงื่อนไข (ด้วย$) - หมายเหตุ:
$ใน projection คืนค่าเพียง 1 องค์ประกอบแรกที่ match