Mongodb怪异的行为存在

时间:2018-02-05 10:19:42

标签: mongodb mongodb-query exists

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

我在集合中有两个简单的文档' user':

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

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

我想检索包含字段" extra"并且该值不等于“不重要”':

查询:

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

返回两个文件。

还有查询

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

返回两个文件。

似乎$存在(当与同一领域的其他条件一起使用时)就像' OR'一样。 我做错了什么?任何帮助表示赞赏。

我使用了mongodb 3.2.6和3.4.9

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

2 个答案:

答案 0 :(得分:3)

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

  

当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。

因此,为了强制执行这两个条款,您应该使用$and运算符,如下所示:

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

答案 1 :(得分:0)

构建查询的方式是错误的,与$exists的工作方式无关。因为您正在检查两个条件,所以您需要一个执行逻辑AND操作的查询来满足这两个条件。

查询的正确语法

  

我想检索包含字段" extra"和   价值不等于“不重要”

应该遵循:

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

或使用 $and 运算符:

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