首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongodb聚合中的条件$first

mongodb聚合中的条件$first
EN

Stack Overflow用户
提问于 2014-09-01 11:39:03
回答 1查看 7.3K关注 0票数 8

我试图找出是否可以将$first和$ifnull或$cond组合在mongodb聚合方法中。假设有下列文件:

代码语言:javascript
运行
复制
{ "_id" : 1, "item" : "box" , "code" : null }
{ "_id" : 2, "item" : "box" , "code" : "abcde" }
{ "_id" : 3, "item" : "box" , "code" : "abcde" }
{ "_id" : 4, "item" : "box" , "code" : null }

然后运行以下聚合方法将文档组合在一起:

代码语言:javascript
运行
复制
db.items.aggregate([{
    $group : {
        _id : '$item',
        code :  { $first : '$code' }
    } 
}])

我的聚合结果是:

代码语言:javascript
运行
复制
{ "result" : [ { "_id" : "box", "code" : null } ], "ok" : 1 }

我想知道是否有一种方法可以将$first操作数与$ifnull或$cond组合起来,以获得不为空的代码字段。所以我的结果会是这样的:

代码语言:javascript
运行
复制
{ "result" : [ { "_id" : "box", "code" : 'abcde' } ], "ok" : 1 }

干杯,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 12:09:14

不是以你想要的方式发生的,你似乎在寻找一种评估$first的“有条件的”方法,而这种情况并没有发生。所有$ifNull可以提供给您的是,如果字段实际上并不“存在”或以其他方式计算为null,则返回一个“备用”值。

但是您不需要这样做,而且基本上您想要的只是首先通过$match语句“过滤”可能的结果:

代码语言:javascript
运行
复制
db.items.aggregate([
    { "$match": { "code": { "$ne": null } } },
    { "$group": { 
        "_id": "$item",
        "code": { "$first": "$code" }
    }}
])

但实际上,在您的情况下,除非您特别需要一个“排序顺序”才能得到结果,否则使用单数字段更好的做法是只使用$max作为操作符,即使$match阶段实际上“仍然”优化了这一点,排除了任何实际上“不应该是”期望结果的一部分的文档:

代码语言:javascript
运行
复制
db.items.aggregate([
    { "$group": { 
        "_id": "$item",
        "code": { "$max": "$code" }
    }}
])

因此,在本例中,$match$max$group中可能是您真正想要的。$first运算符通常只有当您想要从文档中得到多个字段时才有意义,然后通常只在$sort操作之后才有意义,除非您的文档期望磁盘上出现“自然”排序顺序(我们的意思是,事情确实可以移动)。

因此,考虑您实际想要做的事情,并相应地实现。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25605043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档