เมื่อต้องการกรองเฉพาะ sub-document ในอาร์เรย์ที่ตรงเงื่อนไข ให้ใช้ $unwind แยกอาร์เรย์ แล้ว $match กรอง
> db.demo662.insertOne({
... "details": [
... {Name: "Chris", Marks: 35},
... {Name: "Bob", Marks: 45},
... {Name: "David", Marks: 30}
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1b2be24113ea5458c7d04") }
แสดงข้อมูล:
> db.demo662.find();
คิวรีกรองเฉพาะ Marks > 40
> db.demo662.aggregate({$unwind: "$details"}, {$match: {"details.Marks": {$gt: 40}}});ผลลัพธ์ - ได้เฉพาะ Bob ที่ Marks = 45:
คำอธิบาย
- $unwind: "$details" - แยกอาร์เรย์ details ให้แต่ละออบเจกต์เป็นเอกสารแยกต่างหาก
- $match: {"details.Marks": {$gt: 40}} - กรองเอกสารที่ Marks > 40
หากต้องการรวมกลับเป็นอาร์เรย์เดิม
เพิ่ม
$groupต่อท้าย:db.demo662.aggregate([ {$unwind: "$details"}, {$match: {"details.Marks": {$gt: 40}}}, {$group: {_id: "$_id", details: {$push: "$details"}}} ]);จะได้เอกสารเดิมแต่ details มีเฉพาะรายการที่ผ่านเงื่อนไข