Với MongoDb 3.4 và mới hơn, bạn có thể tận dụng việc sử dụng $arrayToObject
toán tử để có được kết quả mong muốn. Bạn sẽ cần chạy đường dẫn tổng hợp sau:
db.collection.aggregate([
{ "$group": {
"_id": {
"date": "$install_date",
"platform": { "$toLower": "$platform" }
},
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": "$_id.date",
"counts": {
"$push": {
"k": "$_id.platform",
"v": "$count"
}
}
} },
{ "$addFields": {
"install_date": "$_id",
"platform": { "$arrayToObject": "$counts" }
} },
{ "$project": { "counts": 0, "_id": 0 } }
])
Đối với các phiên bản cũ hơn, hãy tận dụng lợi thế của $cond
toán tử trong $group
bước quy trình để đánh giá số lượng dựa trên giá trị trường nền tảng, giống như sau:
db.collection.aggregate([
{ "$group": {
"_id": "$install_date",
"android_count": {
"$sum": {
"$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ]
}
},
"ios_count": {
"$sum": {
"$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ]
}
},
"facebook_count": {
"$sum": {
"$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ]
}
},
"kindle_count": {
"$sum": {
"$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ]
}
}
} },
{ "$project": {
"_id": 0, "install_date": "$_id",
"platform": {
"android": "$android_count",
"ios": "$ios_count",
"facebook": "$facebook_count",
"kindle": "$kindle_count"
}
} }
])
Trong phần trên, $cond
nhận một điều kiện logic làm đối số đầu tiên (nếu) và sau đó trả về đối số thứ hai trong đó đánh giá là đúng (sau đó) hoặc đối số thứ ba là sai (khác). Điều này làm cho trả về true / false thành 1 và 0 để cấp dữ liệu cho $sum
tương ứng.
Ví dụ:if { "$eq": [ "$platform", "facebook" ] },
là true thì biểu thức sẽ đánh giá thành { $sum: 1 }
nếu không nó sẽ là { $sum: 0 }