我试图找出是否可以将$first和$ifnull或$cond组合在mongodb聚合方法中。假设有下列文件:
{ "_id" : 1, "item" : "box" , "code" : null }
{ "_id" : 2, "item" : "box" , "code" : "abcde" }
{ "_id" : 3, "item" : "box" , "code" : "abcde" }
{ "_id" : 4, "item" : "box" , "code" : null }
然后运行以下聚合方法将文档组合在一起:
db.items.aggregate([{
$group : {
_id : '$item',
code : { $first : '$code' }
}
}])
我的聚合结果是:
{ "result" : [ { "_id" : "box", "code" : null } ], "ok" : 1 }
我想知道是否有一种方法可以将$first操作数与$ifnull或$cond组合起来,以获得不为空的代码字段。所以我的结果会是这样的:
{ "result" : [ { "_id" : "box", "code" : 'abcde' } ], "ok" : 1 }
干杯,
发布于 2014-09-01 12:09:14
不是以你想要的方式发生的,你似乎在寻找一种评估$first的“有条件的”方法,而这种情况并没有发生。所有$ifNull可以提供给您的是,如果字段实际上并不“存在”或以其他方式计算为null
,则返回一个“备用”值。
但是您不需要这样做,而且基本上您想要的只是首先通过$match语句“过滤”可能的结果:
db.items.aggregate([
{ "$match": { "code": { "$ne": null } } },
{ "$group": {
"_id": "$item",
"code": { "$first": "$code" }
}}
])
但实际上,在您的情况下,除非您特别需要一个“排序顺序”才能得到结果,否则使用单数字段更好的做法是只使用$max作为操作符,即使$match
阶段实际上“仍然”优化了这一点,排除了任何实际上“不应该是”期望结果的一部分的文档:
db.items.aggregate([
{ "$group": {
"_id": "$item",
"code": { "$max": "$code" }
}}
])
因此,在本例中,$match
和$max
在$group
中可能是您真正想要的。$first
运算符通常只有当您想要从文档中得到多个字段时才有意义,然后通常只在$sort
操作之后才有意义,除非您的文档期望磁盘上出现“自然”排序顺序(我们的意思是,事情确实可以移动)。
因此,考虑您实际想要做的事情,并相应地实现。
https://stackoverflow.com/questions/25605043
复制相似问题