Агрегирование в MongoDb для документов, встроенных в список значений - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть данные в MongDb, как показано ниже

{
        "_id" : 7,
        "name" : "Salena Olmos",
        "scores" : [
                {
                        "type" : "exam",
                        "score" : 90.37826509157176
                },
                {
                        "type" : "quiz",
                        "score" : 42.48780666956811
                },
                {
                        "type" : "homework",
                        "score" : 67.18328596625217
                },
                {
                        "type" : "homework",
                        "score" : 96.52986171633331
                }
        ]
}

все, что я хочу суммировать "баллы" для "type": "homework" как

{ "_id" : 7, "score" : 163.71314768258548} 

Я написал свой запрос, используя агрегат и условие фильтра, как показано ниже

db.students.aggregate([
    {     
     "$group" : 
      { 
       "_id":"$_id",
       "score":{$sum: {$filter: {
                                input: "$scores",
                                    as: "x",
                                cond: {$eq : ["$$x.type", "homework"]}
                                }
                      }
               }
      }
    }
])

но все это дает мне как "0" в качестве значения суммы как:

{ "_id" : 7, "score" : 0 }

Пожалуйста, помогите мне, я новичок в MongoDb и пытаюсь учиться, решая некоторые проблемы с упражнениями.

Спасибо

Ответы [ 2 ]

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

Я просмотрел документы MongoDb и нашел решение ниже

  db.students.aggregate([ 
   {$unwind: "$scores"},
   {$match:{"scores.type" : "homework"}},
   {$group : {"_id":"$_id", "score":{$sum: "$scores.score"}}}
 ])
0 голосов
/ 04 сентября 2018

Вы можете использовать ниже агрегации. Используйте $let, чтобы извлечь оценку из совпадающих оценок.

db.students.aggregate({
  "$project":{
    "score":{
      "$sum":{
        "$let":{
          "vars":{
            "mscores":{
              "$filter":{
                "input":"$scores",
                "as":"x",
                "cond":{"$eq":["$$x.type","homework"]}
              }
            }
          },
          "in":"$$mscores.score"
        }
      }
    }
  }
})
...