Запрос только для чисел во вложенном массиве - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь получить среднее число ключей во вложенном массиве внутри документа, но не знаю, как этого добиться.

Вот как выглядит мой документ:

{
  "_id": {
    "$oid": "XXXXXXXXXXXXXXXXX"
  },
  "data": {
    "type": "PlayerRoundData",
    "playerId": "XXXXXXXXXXXXX",
    "groupId": "XXXXXXXXXXXXXX",
    "holeScores": [
      {
        "type": "RoundHoleData",
        "points": 2
      },
      {
        "type": "RoundHoleData",
        "points": 13
      },
      {
        "type": "RoundHoleData",
        "points": 3
      },
      {
        "type": "RoundHoleData",
        "points": 1
      },
      {
        "type": "RoundHoleData",
        "points": 21
      }
    ]
  }
}

Теперь, хитрая часть в том, что мне нужно только среднее значение очков для holeScores [0] всех документов с этим playerid и этим groupid.

На самом деле, лучшим решением было бы собрать все документы с playerid и groupid и создать новый массив со средним значением holeScores [0], holeScores [1], holeScores [2] ... Но если бы я толькоможно получить один ключ массива за раз, что было бы неплохо для: -)

Вот то, что я думаю, но не совсем уверен, как его собрать:

var allScores = dbCollection('scores').aggregate(
    {$match: {"data.groupId": groupId, "playerId": playerId}},
    {$group: {
        _id: playerId, 
        rounds: { $sum: 1 }
        result: { $sum: "$data.scoreTotals.points" }
    }}
);

Действительно надеясьза помощь в этом вопросе и заранее спасибо: -)

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы можете использовать $ unwind с includeArrayIndex для получения индекса, а затем использовать $group для группировки по этому индексу

dbCollection('scores').aggregate(
    {
        $match: { "data.playerId": "XXXXXXXXXXXXX", "data.groupId": "XXXXXXXXXXXXXX" }
    },
    {
        $unwind: {
            path: "$data.holeScores",
            includeArrayIndex: "index"
        }
    },
    {
        $group: {
            _id: "$index",
            playerId: { $first: "data.playerId" }, 
            avg: { $avg: "$data.holeScores.points" }
        }
    }
)
0 голосов
/ 01 октября 2018

Вы можете попробовать ниже агрегации

db.collection.aggregate(
  { "$match": { "data.groupId": groupId, "data.playerId": playerId }},
  { "$group": {
    "_id": null,
    "result": {
      "$sum": {
        "$arrayElemAt": [
          "$data.holeScores.points",
          0
        ]
      }
    }
  }}
)
...