Сумма счета агрегации трубопроводов - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема с агрегацией. Я не могу или не понимаю, как это построить. Это моя коллекция:

{
"_id": ObjectId("5b900efbb9440c000646f803"),
"status": 0,
"date": NumberLong(0),
"player1": {
    "name": "",
    "sets": [{
        "points": [{
            "score": 0,
            "comment": "sa"
        }, {
            "score": 1,
            "comment": "sw"
        }, {
            "score": 2,
            "comment": "sw"
        }]
    }]
},
"player2": {
    "name": "",
    "sets": [{
        "points": [{
            "score": 0,
            "comment": ""
        }, {
            "score": 1,
            "comment": "fh"
        }, {
            "score": 2,
            "comment": "sw"
        }]
    }]
}}

Как я могу посчитать сумму очков для игрока1, где комментарий "sw"?

Спасибо. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я думаю, что это поможет:

db.colname.aggregate(
{
    { $unwind: "$player1.sets" },
    { $unwind: "$player1.sets.points" },
    { $match: { player1.sets.points.comment: "sw" },
    {
        $group : {
           _id : null,
           total: { $sum: $player1.sets.points.comment },
        }
    }
})
0 голосов
/ 05 сентября 2018

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

Используйте $filter для фильтрации точек, где комментарий = 'sw', за которым следует $size для подсчета совпадений в каждом массиве точек. Используйте $map для выполнения логики для всех наборов и $sum для вычисления всех совпадений для всех наборов

db.colname.aggregate([
  {"$match":{"player1.name":"","player2.name":""}},
  {"$project":{
    "count":{
      "$add":[
        {"$sum":{
          "$map":{
            "input":"$player1.sets",
            "as":"set",
            "in":{
              "$size":{
                "$filter":{"input":"$$set.points","cond":{"$eq":["$$this.comment","sw"]}}
              }
            }
          }
        }},
        {"$sum":{
          "$map":{
            "input":"$player2.sets",
            "as":"set",
            "in":{
              "$size":{
                "$filter":{"input":"$$set.points","cond":{"$eq":["$$this.comment","sw"]}}
              }
            }
          }
        }}
      ]
    }
  }}
])
...