Có, sử dụng $arrayToObject
và $map
để chuyển đổi mảng hiện có sang định dạng mà nó chấp nhận:
db.collection.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$concatArrays": [
[{ "k": "date", "v": "$_id.date" }],
{ "$map": {
"input": "$aggr",
"in": { "k": "$$this.gender", "v": "$$this.count" }
}}
]
}
}
}}
])
Tất nhiên nếu điều này thực sự chỉ nằm ở "phần đuôi" của tập hợp hiện có và bạn không có ít nhất MongoDB 3.4.4 nơi toán tử được giới thiệu, thì bạn có thể chỉ cần định hình lại kết quả trong mã khách hàng:
db.collection.aggregate([
// existing pipeline
]).map(d =>
Object.assign(
{ date: d._id.date },
d.aggr.reduce((acc,curr) =>
Object.assign(acc,{ [curr.gender]: curr.count }),{}
)
)
)