ใช้ $addFields ร่วม $objectToArray, $filter, $arrayToObject เพื่อกรองและฉายเฉพาะฟิลด์ซ้อนลึกที่ต้องการ
ตัวอย่างข้อมูลทดสอบ (ออบเจ็กต์ซ้อน 3 ชั้น)
> db.demo379.insertOne({
"details1" : {
"details2" : {
"details3" : {
"10" : "John", "50" : "Chris", "40" : "David", "30" : "Mike"
}
}
}
});
แสดงข้อมูลทั้งหมด
> db.demo379.find().pretty();
{
"_id" : ObjectId("5e5a94f82ae06a1609a00b10"),
"details1" : {
"details2" : {
"details3" : { "10" : "John", "30" : "Mike", "40" : "David", "50" : "Chris" }
}
}
}
คำสั่ง Aggregation กรอง details3 เฉพาะ key 35-60
> db.demo379.aggregate([
{ "$addFields": {
"details1.details2.details3": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$details1.details2.details3" },
"as": "out",
"cond": {
"$and": [
{ "$gte": ["$$out.k", "35"] },
{ "$lte": ["$$out.k", "60"] }
]
}
}
}
}
}}
])
ผลลัพธ์ (เหลือ key 40, 50 เท่านั้น)
{
"_id" : ObjectId("5e5a94f82ae06a1609a00b10"),
"details1" : { "details2" : { "details3" : { "40" : "David", "50" : "Chris" } } }
}
ขั้นตอน:
$objectToArrayแปลง details3 เป็นอาร์เรย์ [{k:"10",v:"John"}, ...]$filterกรองเฉพาะที่ key (k) อยู่ระหว่าง 35-60$arrayToObjectแปลงกลับเป็นออบเจ็กต์$addFieldsเขียนทับฟิลด์เดิม