【问题标题】:Mongo: find items that don't have a certain fieldMongo:查找没有特定字段的项目
【发布时间】:2011-08-08 19:56:29
【问题描述】:

如何在集合中搜索缺少 MongoDB 中某个字段的文档?

【问题讨论】:

    标签: mongodb null exists


    【解决方案1】:

    是的,可以使用$exists

    db.things.find( { a : { $exists : false } } ); // return if a is missing
    

    当为真时,$exists 匹配包含该字段的文档,包括该字段值为空的文档。如果为 false,则查询只返回不包含该字段的文档。

    【讨论】:

    • 请注意,$exist 查询不能使用索引(请参阅mongodb.org/display/DOCS/…)。
    • @Theo:从 MongoDB 2.0 开始 $exists 可以使用索引 (jira.mongodb.org/browse/SERVER-393)
    • 我是为了让 Mongoid 在范围内使用。看起来像这样 > scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
    【解决方案2】:

    如果您不关心该字段是否丢失或null(或者如果它从来没有null),那么您可以使用稍短的并且更安全:

    db.things.find( { a : null } ); // return if a is missing or null
    

    这样更安全,因为 $exists 将返回 true,即使该字段为空,这通常不是预期的结果,并且可能导致 NPE。

    【讨论】:

    • 但是,阅读代码的人可能会将其解释为该字段必须等于 null 并且不能丢失。这实际上是出乎意料的行为,因为您无法对0(也是false)做同样的事情,所以null 在这里是一种例外。因此,最佳实践是使用$exists: false 的更易读的答案,这不是模棱两可的。请记住,如果您需要在其后面加上该评论,那么您稍短的变体实际上并不是更短!
    • @Yeti 如果我的目标是查找所有缺少字段a 值的对象,或者因为anull,或者因为缺少a,那么$exists不够好,因为它无法捕捉anull 的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多