Я пытаюсь собрать суммарные значения статистики миссий каждого пользователя, сгруппированные по городам.
Это мой ввод:
[
{
"missions": {
"Denver": {
"savedTowers": 3,
"savedCity": 0,
"hoursFasted": 68,
"fastPointsEarned": 4080
},
"Boston": {
"savedTowers": 2,
"savedCity": 0,
"hoursFasted": 32,
"fastPointsEarned": 1920
}
}
},
{
"missions": {
"Denver": {
"savedTowers": 4,
"savedCity": 0,
"hoursFasted": 87,
"fastPointsEarned": 5220
},
"Boston": {
"savedTowers": 7,
"savedCity": 1,
"hoursFasted": 120,
"fastPointsEarned": 7200
}
}
}
]
Это код:
db.collection("users").aggregate([
{
"$match": {
"missions": {
"$exists": true,
"$gt": {}
}
}
},
{
"$project": {
"_id": 0,
"city": {
"$objectToArray": "$missions"
}
}
},
{
"$unwind" : "$city"
},
{
"$group": {
"_id": {
"city": "$city.k"
},
"cities": {
"$addToSet": "$city.k"
},
"stats": {
"$addToSet": "$city.v"
},
"players": {
"$sum": 1
}
}
},
{
"$project": {
"_id": 0,
"city": "$_id.city",
"stats": {
"$mergeObjects": "$stats"
},
"players": "$players"
}
}
]).toArray(function(err, response) {
if (err != null) {
console.log("Error: " + err.message);
handleError(res, "Failed to fetch Mission Analytics", err.message);
} else {
res.status(200).send({ "mission_stats": response });
}
});
Это фактический вывод:
{
"mission_stats": [
{
"city": "Boston",
"stats": {
"savedTowers": 2,
"savedCity": 0,
"hoursFasted": 32,
"fastPointsEarned": 1920
},
"players": 2
},
{
"city": "Denver",
"stats": {
"savedTowers": 3,
"savedCity": 0,
"hoursFasted": 68,
"fastPointsEarned": 4080
},
"players": 2
}
]
}
Это ожидаемый вывод:
{
"mission_stats": [
{
"city": "Boston",
"stats": {
"savedTowers": 9,
"savedCity": 0,
"hoursFasted": 152,
"fastPointsEarned": 9120
},
"players": 2
},
{
"city": "Denver",
"stats": {
"savedTowers": 7,
"savedCity": 0,
"hoursFasted": 155,
"fastPointsEarned": 9300
},
"players": 2
}
]
}
Как получилось, что $ mergeObjects сократил массив статистики только до одного объекта,но не удалось объединить значения тоже? Я не вижу совокупных значений в конечном объединенном объекте.