Mongo:查找没有特定字段的项目


107

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

Answers:


171

是的,可以使用$ exists

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

如果为true,则$ exists匹配包含该字段的文档,包括该字段值为null的文档。如果为false,则查询仅返回不包含该字段的文档。


1
警告,$exist查询不能使用索引(请参阅mongodb.org/display/DOCS/…)。
Theo

4
@Theo:从MongoDB的2.0 $存在开始能够使用索引(jira.mongodb.org/browse/SERVER-393
梅德Schetnikovich

在此之后,我想让Mongoid在范围内使用。看起来像这样>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs 2012年

50

如果您不在乎字段是否丢失或null(或者从不null),那么可以使用更短更安全的字段:

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

这样比较安全,因为即使该字段为null $exists也会返回true,这通常不是期望的结果,并且可能导致NPE。


1
但是,读该代码的人可能会解释它,因为该字段必须等于null且不丢失。这实际上是意外的行为,因为您将无法执行相同的操作0(也是false),因此null这里也有例外。因此,最佳实践是使用更具可读性的答案,$exists: false该答案并不明确。请记住,如果您需要在后面加上注释,那么稍短的变体实际上并不短!
雪人

@Yeti如果我的目标是找到所有缺少field值的对象(a由于ais null或因为amissing),那么这$exists还不够好,因为它无法捕获ais 的情况null
nilskp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.