我是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
}
]
}
}
感谢任何帮助。
答案 0 :(得分:2)
请注意,gender
是array
。因此,您需要将查询稍微修改为group by
数组内的对象。
$unwind
,follower_demographics.gender
字段。现在,这将为gender
数组中的对象提供一个文档。
$match
,只有您感兴趣的那些文件,即那些gender
- value
为Male
的文件。
现在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' }
}}
])