我有一个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+版本中)。

10-07 20:44