我有一个文档集合,我想按一个字段分组,除非它不存在,然后我想按第二个字段分组。
作为一个例子,考虑以下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
的值。