ใช้ $project ร่วม $filter ใน aggregation เพื่อคืนค่าเฉพาะสมาชิกในอาร์เรย์ที่ตรงเงื่อนไข สร้างคอลเลกชันตัวอย่าง:
> db.demo355.insertOne({"id":101,"details":[{"Name":"Chris",isMarried:1},{"Name":"David",isMarried:0},{"Name":"Mike",isMarried:1}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e568928f8647eb59e5620c5") }
แสดงข้อมูล:
> db.demo355.find().pretty();
คิวรี project เฉพาะสมาชิกที่ isMarried = 1:
> db.demo355.aggregate([
{ $project: {
details: {
$filter: {
input: "$details",
as: "out",
cond: { $eq: ["$$out.isMarried", 1] }
}
}
}}
])
ผลลัพธ์ (เหลือ Chris และ Mike):
{ "_id" : ObjectId("5e568928f8647eb59e5620c5"), "details" : [ { "Name" : "Chris", "isMarried" : 1 }, { "Name" : "Mike", "isMarried" : 1 } ] }
คำอธิบาย
$filter: สร้างอาร์เรย์ใหม่จาก input โดยเก็บเฉพาะที่ cond = trueas: "out": ตั้งชื่อตัวแปรสำหรับสมาชิกปัจจุบัน (default คือ $$this)cond: เงื่อนไข boolean expression- ต่างจาก $match ที่กรองเอกสาร $filter กรอง สมาชิกในอาร์เรย์
ตัวเลือกเพิ่มเติม
limit(MongoDB 4.4+): จำกัดจำนวนผลลัพธ์- ใช้ร่วม
$mapเพื่อ transform สมาชิกพร้อมกัน - MongoDB 5.0+:
$filterรองรับasoptional (ใช้ $$this โดย default)