Để đưa các subfield lên cấp cao nhất (top-level) trong projection mà không cần liệt kê tất cả khóa, sử dụng $objectToArray và $arrayToObject. Tạo collection:
> db.promoteSubfieldsDemo.insertOne({'s':10,'y':{'t':20,'u':30}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038004190a577c668b55d5") }
Hiển thị tài liệu:
> db.promoteSubfieldsDemo.find().pretty();
Kết quả - cấu trúc lồng nhau:
Aggregation pipeline thăng cấp subfield của "y" lên cấp cao nhất:
> db.promoteSubfieldsDemo.aggregate([ { "$replaceRoot": { "newRoot": { "$arrayToObject": { "$concatArrays": [ [{ "k": "s", "v": "$s" }], { "$objectToArray": "$y" } ] } } }} ]);Kết quả - các trường t, u được đưa lên ngang hàng với s:
Giải thích: 1)
$objectToArraychuyển object "y" thành mảng [{k:"t",v:20},{k:"u",v:30}], 2)$concatArraysgộp với mảng trường s, 3)$arrayToObjectchuyển ngược lại thành object phẳng, 4)$replaceRootthay thế root document.