【发布时间】:2011-08-08 19:56:29
【问题描述】:
如何在集合中搜索缺少 MongoDB 中某个字段的文档?
【问题讨论】:
如何在集合中搜索缺少 MongoDB 中某个字段的文档?
【问题讨论】:
是的,可以使用$exists:
db.things.find( { a : { $exists : false } } ); // return if a is missing
当为真时,$exists 匹配包含该字段的文档,包括该字段值为空的文档。如果为 false,则查询只返回不包含该字段的文档。
【讨论】:
$exist 查询不能使用索引(请参阅mongodb.org/display/DOCS/…)。
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
如果您不关心该字段是否丢失或null(或者如果它从来没有null),那么您可以使用稍短的并且更安全:
db.things.find( { a : null } ); // return if a is missing or null
这样更安全,因为 $exists 将返回 true,即使该字段为空,这通常不是预期的结果,并且可能导致 NPE。
【讨论】:
null 并且不能丢失。这实际上是出乎意料的行为,因为您无法对0(也是false)做同样的事情,所以null 在这里是一种例外。因此,最佳实践是使用$exists: false 的更易读的答案,这不是模棱两可的。请记住,如果您需要在其后面加上该评论,那么您稍短的变体实际上并不是更短!
a 值的对象,或者因为a 是null,或者因为缺少a,那么$exists不够好,因为它无法捕捉a 是null 的情况。