Để chiếu chỉ các thuộc tính lồng sâu thỏa mãn điều kiện, dùng aggregation với $addFields, $objectToArray, $filter, $arrayToObject.
Tạo collection với object lồng sâu:
> db.demo379.insertOne({
"details1" : {
"details2" : {
"details3" : {
"10" : "John", "50" : "Chris", "40" : "David", "30": "Mike"
}
}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a94f82ae06a1609a00b10") }
Xem dữ liệu:
> db.demo379.find().pretty();
{ "_id" : ObjectId("5e5a94f82ae06a1609a00b10"), "details1" : { "details2" : { "details3" : { "10" : "John", "30" : "Mike", "40" : "David", "50" : "Chris" } } } }
Aggregation lọc các key trong khoảng 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"] }
]
}
}
}
}
}}
])
Kết quả (chỉ giữ key 40, 50):
{ "_id" : ObjectId("5e5a94f82ae06a1609a00b10"), "details1" : { "details2" : { "details3" : { "40" : "David", "50" : "Chris" } } } }
Quy trình:
$objectToArray: object → mảng [{k, v}, ...]$filter: lọc phần tử theo điều kiện key$arrayToObject: mảng → object trở lại$addFields: ghi đè trường gốc
Kỹ thuật này hữu ích khi schema động (dynamic keys) cần lọc theo điều kiện key.