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

bcm*_*cfc 105 null exists mongodb

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

And*_*ich 166

是的,可以使用$ exists:

db.things.find( { a : { $exists : false } } ); // return if a is missing
Run Code Online (Sandbox Code Playgroud)

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

  • @Theo:从MongoDB 2.0开始,$ exists能够使用索引(https://jira.mongodb.org/browse/SERVER-393) (4认同)
  • 请注意,“$exist”查询不能使用索引(请参阅http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists)。 (2认同)

nil*_*skp 50

如果你不关心,如果该字段缺少或null(或者,如果它从来没有null),那么你可以用略短更安全:

db.things.find( { a : null } ); // return if a is missing or null
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,阅读代码的人可能会将其解释为该字段必须等于 `null` 且不能丢失。这实际上是出乎意料的行为,因为你不能对 `0`(也是 `false`)做同样的事情,所以 `null` 是这里的一种例外。因此,最佳实践是使用“$exists: false”的更具可读性的答案,这并不含糊。请记住,如果您需要在其背后添加注释,那么您稍微短一点的变体实际上并不短! (2认同)