сумма mongodb по вложенным документам в документе - PullRequest
0 голосов
/ 09 октября 2018

У меня есть коллекция mongodb, похожая на приведенную ниже:

{ 
    '_id' : '123123123123',
    'FOO' : {
        'A' : 2,
        'B' : 1,
        'C' : 5
    },
    'BAR' : {
        'D' : 6,
        'E' : 1
    }
}

Я был бы рад тому, кто объяснит мне, как суммировать числа в поддокументы.Я хочу получить этот результат:

{
    '_id' : 'blahblah',
    'FOO' : 8,
    'BAR' :13
}

Ответы [ 2 ]

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

Полагаю, вы могли бы сделать что-то вроде следующего и просто передать массив для фильтрации полей:

var field = [ "FOO", "BAR" ];

db.test.aggregate([  
   {  
      $project:{  
         "values":{  
            $filter:{  
               input:{  
                  "$objectToArray":"$$ROOT"
               },
               cond:{  
                  $in:[  
                     "$$this.k",
                     fields
                  ]
               }
            }
         }
      }
   },
   {  
      $unwind:"$values"
   },
   {  
      $project:{  
         key:"$values.k",
         values:{  
            "$sum":{  
               "$let":{  
                  "vars":{  
                     "item":{  
                        "$objectToArray":"$values.v"
                     }
                  },
                  "in":"$$item.v"
               }
            }
         }
      }
   }
]);

Который после выполнения даст следующий вывод:

{ "_id" : "123123123123", "key" : "FOO", "values" : 8 }
{ "_id" : "123123123123", "key" : "BAR", "values" : 7 }
0 голосов
/ 09 октября 2018

Вы можете использовать агрегацию ниже в 3.4.

Обновление:

db.colname.aggregate({
  "$replaceRoot":{
    "newRoot":{
      "$mergeObjects":[
        {"_id":"$_id"},
        {"$arrayToObject":{
          "$map":{
            "input":{
              "$filter":{
                "input":{"$objectToArray":"$$ROOT"},
                "cond":{"$in":["$$this.k",["FOO","BAR"]]}
              }
            },
            "in":{
              "k":"$$this.k",
              "v":{
                "$sum":{
                  "$let":{
                    "vars":{
                      "kv":{"$objectToArray":"$$this.v"}},
                      "in":"$$kv.v"
                  }
                }
              }
            }
          }
        }}
      ]
    }
  }
})

Оригинал:

db.colname.aggregate({
  "$project":{
    "FOO":{
      "$sum":{
        "$let":{
          "vars":{"fookv":{"$objectToArray":"$FOO"}},
          "in":"$$fookv.v"
        }
      }
    },
    "BAR":{
      "$sum":{
        "$let":{
          "vars":{"barkv":{"$objectToArray":"$BAR"}},
          "in":"$$barkv.v"
        }
      }
    }
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...