如何使用Mongodb聚合获取Male的值总和

时间:2015-12-13 15:22:50

标签: mongodb mongodb-query aggregation-framework

我是mongoDB的新手并且无法获得值的总和。我想通过Male得到Date分组的总和。 我怎样才能做到这一点?我尝试了以下查询,但没有奏效。我无法检索到Male的值。

db.sales.aggregate(
[
  {
    $group : {
       _id: "$date",
       TotalMaleValue: { $sum: "$follower_demographics.gender.value" }
    }
  }
]
)

我的文件如下:

{
        "_id" : ObjectId("566dd67aef3ccf85743c4b10"),
        "date" : "somedate",
        "follower_demographics" : {
                "gender" : [
                        {
                                "key" : "Male",
                                "value" : 480
                        },
                        {
                                "key" : "Female",
                                "value" : 1705
                        }
                ]
        }
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

请注意,genderarray。因此,您需要将查询稍微修改为group by数组内的对象。

  • $unwindfollower_demographics.gender字段。现在,这将为gender数组中的对象提供一个文档。

  • $match,只有您感兴趣的那些文件,即那些gender - valueMale的文件。

  • 现在gender key - value并获得db.sales.aggregate([ {$match:{"follower_demographics.gender.key":"Male"}}, {$unwind:"$follower_demographics.gender"}, {$match:{"follower_demographics.gender.key":"Male"}}, {$group:{"_id":"$date", "sum_of_males":{$sum:"$follower_demographics.gender.value"}}} ]) 字段的$group

示例代码:

void try1(int x,int y)
{  
    for ( int k = 0; k < 2; ++k ){
        h[x][y] = c[k];
        if ( is it okay to put this color in this position ){
            if ( x == 9 && y == 9 ){ // table is full
                // we have found the solution
                // print the table
                return;
            }
            // assuming x is the number of current row
            // assuming y is the number of current column
            // assuming we are filling the matrix from left to right
            //                                         and top to bottom
            int next_x, next_y;
            if ( y == 9 ){ 
                next_y = 0;
                next_x = x+1;
            } else {
                next_y = y+1;
                next_x = x;
            }
            try1(next_x, next_y);
        }
        h[x][y] = ' '; // clear this place
    }
}

答案 1 :(得分:2)

如果您使用的是MongoDB-3.2或更新,那么最好的方法是$project您的文档,并使用$filter运算符返回一个只有数组的数组那些“关键”是“男性”的子文件。然后,管道中的下一个阶段将是$unwind阶段,您可以在其中对数组进行非规范化。最后阶段是$group阶段,您可以使用$sum累加器运算符来计算“值”的总和。

当然,管道开头的$match阶段只允许您选择符合条件的文档。这可以减少管道下一阶段要处理的文档的大小。

db.sales.aggregate([
    { '$match': { 
        'follower_demographics.gender': { '$elemMatch': {'key': 'Male' } }
    }}, 
    {
        '$project': {
            'date': 1, 
            'gender': { 
                '$filter': { 
                    'input': '$follower_demographics.gender', 
                    'as': 'g', 
                    'cond': { '$eq': [ '$$g.key', 'Male' ] } 
                }
            }
        }
    },
    { '$unwind': '$gender' },
    { '$group': { 
        '_id': '$date', 
        'TotalMaleValue': { '$sum': '$gender.value' }
    }}
])

在MongoDB 3.2之前,您需要在$match之后使用鲜为人知的$redact运算符来返回一个只包含“key”为“Male”的子文档的数组。

db.sales.aggregate([
    { '$match': { 
        'follower_demographics.gender': { '$elemMatch': { 'key': 'Male' }}
    }}, 
    { '$redact': {
        '$cond': [
            { '$or': [ { '$eq': [ '$key', 'Male' ] }, { '$not': '$key' } ] }, 
            '$$DESCEND', 
            '$$PRUNE'
        ] 
    }}, 
    { '$unwind': '$follower_demographics.gender' }, 
    { '$group': { 
        '_id': '$date', 
        'TotalMaleValue': { '$sum': '$follower_demographics.gender.value' }
    }}
 ])