我正在使用mongo 3.0.4按键分组数据。假设我们有一些mongo文件,比如
{'a': 1, 'b': 2, 'name': 'leo'}
{'a': 1, 'b': 2, 'name': 'leo'}
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'}
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'}
我尝试按键“名称”汇总,并使用下面的代码汇总所有a,b,c字段
[
{
'$group': {
'_id': '$name',
'a': {
'$sum': '$a'
},
'b': {
'$sum': '$b'
},
'c': {
'$sum': '$c'
}
}
}
]
并获得结果
[
{
'_id': 'leo',
'a': 2,
'b': 4,
'c': 0
},
{
'_id': 'amy',
'a': 4,
'b': 4,
'c': 0
}
]
问题是组leo中的“c”字段也是0,我希望它为null。 并且预期的结果应该是
[
{
'_id': 'leo',
'a': 2,
'b': 4,
'c': null
},
{
'_id': 'amy',
'a': 4,
'b': 4,
'c': 0
}
]
或
[
{
'_id': 'leo',
'a': 2,
'b': 4
},
{
'_id': 'amy',
'a': 4,
'b': 4,
'c': 0
}
]
我知道$sum
运算符将无数字字段视为0,所以有没有办法做到这一点?使用sum运算符时,如何区分null和0?
答案 0 :(得分:1)
我试过这个,可能这对你有帮助
db.gg.aggregate([{
'$group': {
'_id': '$name',
'a': {
'$sum': '$a'
},
'b': {
'$sum': '$b'
},
'c': {
'$sum': '$c'
},
cdata: {
$push: {
c: "$c"
}
}
}
},
{
$project: {
_id: 1,
a: 1,
b: 1,
c: {
$cond: [{
$eq: [{
$setIsSubset: [
[{}], "$cdata"
]
}, true]
}, null, "$c"]
}
}
}
])
输出:
{ "_id" : "amy", "a" : 4, "b" : 4, "c" : 0 }
{ "_id" : "leo", "a" : 2, "b" : 4, "c" : null }
答案 1 :(得分:1)
最后我发现了这个
[
{
'$project': {
'a': 1,
'b': 1,
'c': 1,
'c_count': {
'$cond': [
{'$gt': ['$c', null]},
1,
0
]
}
}
},
{
'$group': {
'_id': '$name',
'a': {
'$sum': '$a'
},
'b': {
'$sum': '$b',
},
'c': {
'$sum': '$c'
},
'c_count': {
'$sum': '$c_count'
}
}
},
{
'$project': {
'a': 1,
'b': 1,
'c': {
'$cond': [
'$c_count',
'$c',
null
]
}
}
}
]
第一个项目可以找出包含字段c的doc计数, 因为bson-sort-order中的空字段很低。之后,可以在以下管道中挖掘零和0