【问题标题】:Conditional $first in mongodb aggregationmongodb聚合中的条件$first
【发布时间】:2014-09-01 20:09:14
【问题描述】:

我想弄清楚是否可以在 mongodb 聚合方法中以某种方式组合 $first 和 $ifnull 或 $cond。 假设以下文件:

{ "_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 }

干杯,

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    不是按照你希望的方式发生的。您似乎正在寻找一种“有条件”的方式来评估$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" }
        }}
    ])
    

    所以在这种情况下,$group 中的 $match$max 可能是您真正想要的。 $first 运算符通常仅在您希望文档中的多个字段作为结果时才有意义,然后通常仅在 $sort 操作之后才有意义,除非您的文档期望它们出现在磁盘上的“自然”排序顺序(我们的意思是确切地说,东西可以四处移动)。

    因此,请考虑您实际想要做什么并相应地实施。

    【讨论】:

    • 使用 $max 操作数为我解决了这个问题。显然,聚合方法认为值大于空值。谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 2021-02-22
    • 2012-11-30
    • 2017-02-19
    • 2019-03-05
    • 2023-03-16
    • 2022-11-23
    • 2023-01-17
    相关资源
    最近更新 更多