如何在MongoDB中搜索缺少某个字段的集合中的文档?
是的,可以使用$exists:
db.things.find( { a : { $exists : false } } ); // return if a is missing
当 为 true 时,$exists 匹配包含该字段的文档,包括字段值为 null 的文档。如果 为 false,则查询仅返回不包含该字段的文档。
当 为 true 时,$exists 匹配包含该字段的文档,包括字段值为 null 的文档。如果 为 false,则查询仅返回不包含该字段的文档。
如果您不在意字段是否缺失或null
(或者它从未为null
),那么您可以使用稍微更短、更安全的方法:and。
db.things.find( { a : null } ); // return if a is missing or null
这样更安全,因为即使字段为null,$exists
也会返回true
,而这通常不是期望的结果,可能会导致NPE。
$exists: false
更易读的答案,这样就不会产生歧义。请记住,如果您需要在其后添加注释,则稍微缩短的变体实际上并不更短! - Yetia
值的对象,无论是因为a
为null
还是因为a
丢失,那么$exists
就不够好了,因为它无法捕获a
为null
的情况。 - nilskp{ $exists: false }
如果有索引也不会使用它,但是如果有一个索引,{ $eq: false }
将会使用它。 - Alex Jonesconst userSchema = new Schema({ name: String });
const User = mongoose.model('User', userSchema);
// By default, this is equivalent to `User.find()` because Mongoose filters out `notInSchema`
await User.find({ notInSchema: 1 });
// Set `strictQuery: false` to opt in to filtering by properties that aren't in the schema
await User.find({ notInSchema: 1 }, null, { strictQuery: false });
// equivalent:
await User.find({ notInSchema: 1 }).setOptions({ strictQuery: false });
$exist
查询无法使用索引(请参见http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists)。 - Theoscope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
- genkilabs