【问题标题】:Sum array elements in Mongodb aggregationMongodb聚合中的数组元素求和
【发布时间】:2015-12-06 14:42:57
【问题描述】:

我有以下集合,每个文档中都有 c 数组

{
  {
    id: 1,
    k: 2.2,
    type: "dog",
    c: [ {parentId:1, p:2.2}, {parentId:1, p:1.4} ]
  },

  {
    id: 2,
    k: 4.3,
    type:"cat",
    c: [ {parentId:2, p:5.2}, {parentId:2, p:4.5} ]
  }
}

c 中每个子文档中的parentId 是包含文档的 ID。

我想按type 对所有文档进行分组,并且在每个组中知道k 的总和以及该组所有数组中所有p 的总和。

目前我在小组赛阶段对k 求和,但在应用程序的结果数组中对p 求和。我想对 DB 中的p 求和!

这是我目前所做的:

db.myCol.aggregate([

{ 
  $group: {
    _id: { type: '$type'},
    k: {$sum: '$k'}, // sum k values, very easy!
    // p: {$sum: '$c.0.p'} <==== Does not work, too
    c: {$addToSet: '$c'} // add to each group all c arrays of group's members
  }   
}
], function(err, res) {
   // go over c-arrays and sum p values
   var accP = 0; // accumulator for p values
   for ( var i=0; i<res.length; i++ ) {
     var c = res[i].c;
     for (var j=0;j<c.length; j++) {
       var c2 = c[j];
       for ( var k=0; k<c2.length; k++) { // finally got to objects c array
          accP += c2[k].p;
       }
     }
     res[i].c = accP; // replace array with accumulated p value
   }
});

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您需要首先通过“类型”$group 您的文档,使用$sum 累加器运算符返回“k”的总和,并使用返回“c”的二维数组的$push。现在您需要两个 "$unwind" 阶段,在其中非规范化“c”二维数组。您在管道中的最后一个阶段是另一个 $group 阶段,您可以在其中使用“点符号”计算“p”的总和

    db.collection.aggregate([
        { '$group': {
            '_id': '$type', 
            'k': { '$sum': '$k' }, 'c': { '$push': '$c' } 
        } }, 
        { '$unwind': '$c' }, 
        { '$unwind': '$c' },
        { '$group': { 
            '_id': '$_id', 
            'k': { '$first': '$k' }, 
            'c': { '$sum': '$c.p' }
        }}
    ])
    

    产量:

    { "_id" : "dog", "k" : 2.2, "c" : 3.6 }
    { "_id" : "cat", "k" : 4.3, "c" : 9.7 }
    

    Starting in version 3.2,以下累加器表达式,以前只能在$group 阶段使用,现在也可以在$project 阶段使用。

    这意味着我们可以利用这一点并在$project 中使用$sum 累加器运算符。当然,$map 运算符会为每个文档返回一个“p”数组。

    db.collection.aggregate([
        { '$project': { 
            'type': 1, 
            'k': 1, 
            'c': { 
                '$sum': {
                    '$map': { 
                        'input': '$c', 
                        'as': 'subc', 
                        'in': '$$subc.p'
                    }
                }
            }
        }}, 
        { '$group': { 
            '_id': '$type', 
            'k': { '$sum': '$k' }, 
            'c': { '$sum': '$c' }
        }}
    ])
    

    返回:

    { "_id" : "cat", "k" : 4.3, "c" : 9.7 }
    { "_id" : "dog", "k" : 2.2, "c" : 3.6 }
    

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 2022-08-23
      • 2017-03-07
      • 2019-03-14
      • 2019-10-27
      • 2019-02-02
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多