首页 > 解决方案 > mongodb对文档中的子文档求和

问题描述

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

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

我会很高兴有人向我解释如何将数字汇总到子文档中。我想得到这个结果:

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

标签: mongodbaggregation-framework

解决方案


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

推荐阅读