Вы должны сказать $sum
дважды :
var sortedBoard = db.collection.aggregate([
{ "$match": { "leaderboardId": boardId}},
{ "$group": {
"_id": "$playerId",
"SortBoard": { "$first": "$SortBoard" },
"played": { "$sum": 1 },
"strokes": { "$sum": { "$sum": "$data.holeScores.strokes"} }
}},
{ "$project": {
"type": "$SortBoard",
"avgPoints": "$playeyed",
"sumPoints": "$strokes",
"played": "$played"
}}
])
Причина в том, что вы используете его оба какспособ "суммировать значения массива", а также как "аккумулятор" для $group
.
Другая вещь, которую вы, похоже, пропускаете, это то, что $group
выводит только те поля, которые вы ему сообщаете, поэтому, если вы хотите получить доступ к другим полям на других этапах или выводе, вам нужно сохранить их с чем-то вроде $first
или другим аккумулятором.В любом случае мы также, похоже, пропускаем этап конвейера в этом вопросе, но стоит отметить, просто чтобы быть уверенным.
Также обратите внимание, что вам действительно следует обернуть конвейеры агрегации в качестве официального массива []
, потому что устаревшее использованиеустарел и может вызвать проблемы в некоторых языковых реализациях.
Возвращает правильные детали курса:
{
"_id" : "43345jhiuy3498jh4358yu345j",
"avgPoints" : 1,
"sumPoints" : 12,
"played" : 1
}