ใช้ $filter ร่วมกับ $let และ $slice ใน $addFields
สามารถกรองอาร์เรย์ให้เหลือเฉพาะอิลิเมนต์ที่ตรงเงื่อนไข และเลือกอิลิเมนต์สุดท้ายด้วย $slice
สร้างข้อมูลตัวอย่าง
> db.demo751.insertOne({
_id: 101,
details: [
{ Name: "Robert", id:110, Age:21 },
{ Name: "Rae", id:110, Age:22 },
{ Name: "Ralph", id:116, Age:23 }
]
});
แสดงข้อมูลทั้งหมด
> db.demo751.find().pretty();
ผลลัพธ์:
{ "_id" : 101, "details" : [ { "Name" : "Robert", "id" : 110, "Age" : 21 }, { "Name" : "Rae", "id" : 110, "Age" : 22 }, { "Name" : "Ralph", "id" : 116, "Age" : 23 } ] }
คิวรีกรองเฉพาะ id=110 และเอาเฉพาะรายการสุดท้าย
> db.demo751.aggregate([
{
$addFields: {
details: {
$let: {
vars: {
filtered: { $filter: { input: "$details", as: "out", cond: { $eq: [ "$$out.id", 110 ] } } }
},
in: { $slice: [ "$$filtered", -1 ] }
}
}
}
}
])
ผลลัพธ์: เหลือเฉพาะรายการ Rae (รายการสุดท้ายของ id 110)
{ "_id" : 101, "details" : [ { "Name" : "Rae", "id" : 110, "Age" : 22 } ] }