如何使用Mongodb aggregate获取男性的值之和
我是mongoDB的新手,在获取值的总和时遇到困难。我想按日期得到男性分组的总数。 我怎样才能做到这一点?我尝试了下面的查询,但没有成功。我很难找回男性的价值如何使用Mongodb aggregate获取男性的值之和,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我是mongoDB的新手,在获取值的总和时遇到困难。我想按日期得到男性分组的总数。 我怎样才能做到这一点?我尝试了下面的查询,但没有成功。我很难找回男性的价值 db.sales.aggregate( [ { $group : { _id: "$date", TotalMaleValue: { $sum: "$follower_demographics.gender.value" } } } ] ) 我的文档如下所示: { "_
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
}
]
}
}
感谢您的帮助。请注意,性别是一个数组。因此,您需要稍微修改查询以按数组中的对象分组
,follower_demographics.gender字段。现在,这将为gender数组中的一个对象提供一个文档
,只有那些你感兴趣的文件,即那些具有男性性别价值的文件
现在,按性别键并获取值字段的值
示例代码:
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"}}}
])
如果您使用的是MongoDB-3.2或更高版本,那么最好的方法是对您的文档执行此操作,并使用运算符返回一个仅包含键为男性的子文档的数组。管道中的下一个阶段将是对数组进行非规范化的阶段。最后一个阶段是使用累加器运算符计算值之和的阶段
当然,管道开头的阶段只允许您选择那个些符合条件的文档。这可以减少要在管道的下一阶段处理的文档的大小
db.sales.aggregate[
{$match':{
‘follower_demographics.gender’:{$elemMatch':{'key':'Male'}
}},
{
“$project”:{
“日期”:1,
“性别”:{
“$filter”:{
“输入”:“$follower_demographics.gender”,
‘as’:‘g’,
'cond':{'$eq':['$$g.key','Male']}
}
}
}
},
{'$REWIND':'$SEXT'},
{'$group':{
“_id”:“$date”,
'TotalMaleValue':{'$sum':'$gender.value'}
}}
]
在MongoDB 3.2之前,您需要在$match之后使用鲜为人知的运算符返回一个数组,其中只包含键为男性的子文档
db.sales.aggregate[
{$match':{
“follower_demographics.gender':{$elemMatch':{'key':'Male'}
}},
{$redact':{
“$cond”:[
{'$or':[{'$eq':['$key',Male']},{'$not':'$key'}]},
“$$下降”,
“$$PRUNE”
]
}},
{'$unwind':'$follower_demographics.gender'},
{'$group':{
“_id”:“$date”,
'TotalMaleValue':{'$sum':'$follower_demographics.gender.value'}
}}
]