2016-01-27 3 views
0

У меня есть массив значений, которые я хочу сгруппировать по id и получить сумму всех значений. В настоящее время я пытаюсь:Агрегация массива значений в MongoDB

db.entries.aggregate(
[ 
    { $match: {"user": "John" } }, 
    { "$unwind": '$games'}, 
    { $group: { 
     "_id": "$games.id", 
     "score": { "$sum": "$games.score"} }}, 
]) 

Данные выглядит следующим образом:

{ 
    "user":"john", 
    "games":[ 
     { 
     "id":123, 
     "score":123 
     } 
    ] 
}, 
{ 
    "user":"john", 
    "games":[ 
     { 
     "id":123, 
     "score":123 
     } 
    ] 
}, 
{ 
    "user":"john", 
    "games":[ 
     { 
     "id":256, 
     "score":256 
     } 
    ] 
} 

В этом примере для «John» Я хотел бы, чтобы получить общее количество всех уникальных игровых очков. Я должен получить (123 + 256) в этом примере.

Однако сейчас я получаю сумму отдельных игр, а не всех из них в целом.

+1

В чем проблема? – solomkinmv

+0

Является ли игра всегда одним массивом элементов? – styvane

ответ

0

я здесь:

> db.entries.find(); 
{ "_id" : ObjectId("56a9610cca390d7e14a54486"), "user" : "john", "games" : [ { "id" : 123, "score" : 123 } ] } 
{ "_id" : ObjectId("56a9610cca390d7e14a54487"), "user" : "john", "games" : [ { "id" : 123, "score" : 123 } ] } 
{ "_id" : ObjectId("56a9610cca390d7e14a54488"), "user" : "john", "games" : [ { "id" : 256, "score" : 256 } ] } 
> db.entries.aggregate([ {$match: {user: "john"}}, {$unwind: "$games"}, {$group: {_id: "$games.id", score: {$sum: "$games.score"}}} ]); 
{ "_id" : 256, "score" : 256 } 
{ "_id" : 123, "score" : 246 } 

В чем проблема?

+0

Я бы очень хотел получить общий балл 379. Заметим также, что баллы с id 123 должны учитываться только один раз. (Aka, not be 246) –

+0

Это не имеет смысла. Вы агрегированы '$ game.id': есть два идентификатора (123 и 256). Сумма всех игр с ID 123 равна 246, а сумма всех игр (одна игра в случае) с ID 256 равна 256. Здесь ничего плохого. Вы хотите только одну игру за ID и сумму всех элементов, не так ли? –

+0

Что я понимаю, вы хотите: 'db.entries.aggregate ([{$ match: {user:" john "}}, {$ group: {_id:" $ games.id ", оценка: {$ first:" $ games.score "}}}, {$ unwind:" $ score "}, {$ group: {_id: 1, score: {$ sum:" $ score "}}}]);' –

Смежные вопросы