mongodb对文档中子文档的总和

时间:2018-10-09 13:44:31

标签: mongodb aggregation-framework

我有一个类似于以下内容的mongodb集合:

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

我将非常高兴,他向我解释了如何将数字求和成子文档。我想得到这个结果:

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

2 个答案:

答案 0 :(得分:1)

您可以在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"
        }
      }
    }
  }
})

答案 1 :(得分:0)

我想您可以执行以下操作,只需传入数组以过滤字段即可:

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 }