Mongodb $exists的怪异行为

我不了解命令$exists的行为.

我在“用户”集合中有两个简单的文档:

/* 1 */
{
    "_id" : ObjectId("59788c2f6be212c210c73233"),
    "user" : "google"
}

/* 2 */
{
    "_id" : ObjectId("597899a80915995e50528a99"),
    "user" : "werty",
    "extra" : "very important"
}

我想检索包含字段“额外”且值不等于“不重要”的文档:

查询:

db.getCollection('users').find(
{"extra":{$exists:true},"extra": {$ne:"unimportant"}}
)

返回两个文档.

还查询

db.getCollection('users').find(
{"extra":{$exists:false},"extra": {$ne:"unimportant"}}
)

返回两个文档.

似乎$exists(当在同一字段上与另一个条件一起使用时)的工作方式类似于“ OR”.
我做错了什么?任何帮助表示赞赏.

我使用了mongodb 3.2.6和3.4.9

我看过Mongo $exists query does not return correct documents
但我没有稀疏索引.

最佳答案
根据MongoDB文档(https://docs.mongodb.com/manual/reference/operator/query/and/):

Using an explicit AND with the $and operator is necessary when the same field or operator has to be specified in multiple expressions.

因此,为了强制执行两个子句的累加,应使用$and运算符,如下所示:

db.getCollection('users').find({ $and : [ { "extra": { $exists : true } }, { "extra" : { $ne : "unimportant" } } ] });

转载注明原文:Mongodb $exists的怪异行为 - 代码日志