Получить сумму вложенного массива в совокупности - PullRequest
0 голосов
/ 06 июня 2018

Хорошо, у меня есть проблема, которую я не могу решить.

У меня есть такой документ:

{
  "playerId": "43345jhiuy3498jh4358yu345j",
  "leaderboardId": "5b165ca15399c020e3f17a75",
  "data": {
    "type": "EclecticData",
    "holeScores": [
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 3,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 1,
        "strokes": 5,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 4
      }
    ]
  }
}

Теперь я пытаюсь использовать агрегированную суммуштрихи, а затем заказать его потом.Я пытаюсь это:

var sortedBoard = db.collection.aggregate(
    {$match: {"leaderboardId": boardId}},
    {$group: {
        _id: "$playerId",
        played: { $sum: 1 },
        strokes: {$sum: '$data.holeScores.strokes'}
        }
    },
    {$project:{ 
        type: "$SortBoard",
        avgPoints: '$played',
        sumPoints: "$strokes",
        played : '$played'
    }}
);

Проблема здесь в том, что я правильно получаю чистую сумму штрихов, поскольку она находится внутри другого массива.

Надеюсь, что кто-то может помочь мне с этим, и спасибозаранее: -)

1 Ответ

0 голосов
/ 06 июня 2018

Вы должны сказать $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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...