文档中子文档上的mongodb和

文档中子文档上的mongodb和,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个类似于下面的mongodb集合: { '_id' : '123123123123', 'FOO' : { 'A' : 2, 'B' : 1, 'C' : 5 }, 'BAR' : { 'D' : 6, 'E' : 1 } } 如果有人向我解释如何将数字求和到子文档中,我将不胜感激。我想得到这个结果: { '_id' : 'blahblah', 'FO

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

{ 
    '_id' : '123123123123',
    'FOO' : {
        'A' : 2,
        'B' : 1,
        'C' : 5
    },
    'BAR' : {
        'D' : 6,
        'E' : 1
    }
}
如果有人向我解释如何将数字求和到子文档中,我将不胜感激。我想得到这个结果:

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

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

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

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 }