当未定义时,$group by alternative



我有一个文档集合,我想按一个字段分组,除非它不存在,然后我想按第二个字段分组。

作为一个例子,考虑以下4个文档:

{
    prop1: 'anything',
    prop2: 1
},
{
    prop1: 'anything',
    prop2: 2
},
{
    prop1: 'something'
},
{
    prop1: 'something else'
}

当我按'prop2'分组时,我将得到3组结果。一:

prop2 == 1 and

prop2 == 2 and

prop2 == undefined

但是我想要得到4个结果。一:

prop2 == 1 and

prop2 == 2 and

prop1 == 'something' and

prop1 == 'something else'

这可能吗?这是一个非常复杂的查询吗?我是不是最好填上缺失的字段,以便对其进行分组?

您需要在$group阶段使用$ifNull条件聚合运算符。

db.coll.aggregate([ 
    { "$group": { "_id": { "$ifNull": [ "$prop1", "$prop2" ] } } }
])

$ifNull操作符返回第二个表达式的值,如果第一个表达式的计算结果为空值,或者如果字段缺失。这就是你想要的。


您可能希望在管道中添加$project级,但这将是冗余的,并且会导致应用程序的性能下降。

$project 阶段进行分组前,可以使用 $ifNull 运算符

db.cullection.aggregate(
  { $project: { "groupVal": { $ifNull: [ '$prop2', '$prop1' ] } } }, 
  { $group: { "_id": "$groupVal" } }
);

对于每个文档,它将设置值groupVal,根据它应该在下一个$group阶段进行分组。因此,对于定义了prop2字段的文档,将选择来自prop2的值,否则将选择来自prop1的值。

相关内容

  • 没有找到相关文章

最新更新