我有一个mongo数据库,在那里我运行一些聚合查询。下面是我要运行的简化查询:
db.coll.aggregate([
{ $group: {
_id: 'fieldA',
fieldB: { $avg: '$fieldB' }
} },
])
它按fielda分组数据并计算fieldb的平均值。无论如何,结果集中的某些行将0作为fieldb的值。有两个原因:
平均值为0。
组中的所有文档都没有fieldb(或将null作为值);在这种情况下,mongo行为将返回0。
是否可以在不发出其他查询和不离开聚合管道的情况下确定结果选择中的每一行发生了哪种情况?
更新
我无法筛选出非空字段,因为我正在对少数字段进行聚合,例如:
db.coll.aggregate([
{ $group: {
_id: 'fieldA',
fieldB: { $avg: '$fieldB' },
fieldC: { $avg: '$fieldC' }
} },
])
有些文档可能有fieldb,但没有fieldc,反之亦然。
最佳答案
您可以在$match
操作之前使用$group
筛选数据。
db.coll.aggregate([
{ $match: { fieldB : {$ne : null }}}},
{ $group: {
_id: 'fieldA',
fieldB: { $avg: '$fieldB' }
} },
])
这样,您将只获得设置了
fieldB
的文档。更新
您不能那样使用
$avg
运算符,但可以使用$min运算符确定是否所有值都NULL
:db.coll.aggregate([
{ $group: {
_id: 'fieldA',
fieldB: { $avg: '$fieldB' } ,
fieldBAllNullOrMin: { $min: '$fieldB' }
} },
])
如果所有值都为空,
$min
运算符将返回null
,否则将返回min.value(但仅在MongoDB的2.4+版本中)。