ใช้ $match หาเอกสารหลัก แล้ว $addFields ร่วม $filter เพื่อคืนค่าเฉพาะ sub-documents ที่ตรงเงื่อนไข สร้างคอลเลกชันตัวอย่าง:
> db.demo345.insertOne({
"UserName" : "Robert",
"UserDetails" : [
{"isMarried" : false, "CountryName":"US"},
{"isMarried" : true, "CountryName":"UK"},
{"isMarried" : false, "CountryName":"AUS"}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5404fdf8647eb59e5620ac") }
แสดงข้อมูล:
> db.demo345.find();
คิวรีหา UserName="Robert" แล้วกรอง UserDetails ที่ isMarried = true:
> db.demo345.aggregate([
{ $match: { UserName: "Robert" } },
{ $addFields: {
UserDetails: {
$filter: {
input: "$UserDetails",
cond: { $eq: ["$$this.isMarried", true] }
}
}
}}
])
ผลลัพธ์ (เหลือเฉพาะ UK ที่ isMarried=true):
{ "_id" : ObjectId("5e5404fdf8647eb59e5620ac"), "UserName" : "Robert", "UserDetails" : [ { "isMarried" : true, "CountryName" : "UK" } ] }
จุดสำคัญ
$matchก่อน: ลดเอกสารลงเหลือ 1 ตัว (ใช้ index ได้)$filter: สร้างอาร์เรย์ใหม่ที่มีเฉพาะสมาชิกผ่านเงื่อนไข$$this: อ้างอิง sub-document ปัจจุบันใน UserDetails- เอกสารต้นฉบับไม่เปลี่ยนแปลง (aggregation เป็น read-only)
- หากต้องการอัปเดตจริง ใช้
updateOne()ร่วม$setและ$filterใน update pipeline (MongoDB 4.2+)