Mongo {$ ne:null}没有按预期工作

Jen*_*lad 6 null mongodb

当我发出以下查询时:

db.users.find({"pic.status" : {$ne : null} }, {"pic" : 1}).toArray()
Run Code Online (Sandbox Code Playgroud)

我希望收到pic.status为非null的所有用户.但是,实际结果如下所示:

{                                                                                                                                      
    "_id" : ObjectId("4f1e1ab9cdf9dbaa160000bf"),
    "pic" : {
        "id" : "4f1e1ab9cdf9dbaa160000be",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
},
{
    "_id" : ObjectId("4f1e28480eaf38193d00006f"),
    "pic" : {
        "id" : "4f1e28480eaf38193d00006e",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我收到pic.status为空的用户.我怎样才能解决这个问题?

uir*_*ron 6

我知道这是一个老问题,可能不再相关,但由于没有接受的答案,我想我会评论任何寻找答案的人.

我能够在MongoDB版本2.4.9上重现该问题.

> db.sourceListings.findOne({displayed:{$ne:null}});
{
   <.. other stuff went here..>
   "displayed" : null
}
Run Code Online (Sandbox Code Playgroud)

版本2.6.1上的问题消失了:

> db.sourceListings.findOne();
{
   <.. other stuff ..>
   "displayed" : null
}
> db.sourceListings.findOne({displayed:{$ne:null}});
null
Run Code Online (Sandbox Code Playgroud)

可能是在这两个版本之间的某个地方修复了.


Mar*_*arc 2

我似乎无法重现这一点。您使用什么版本的 Mongo?(我使用的是 2.1.1-pre)以下是我采取的步骤。以下来自 JS shell:

> db.users.save({                                                                                                                                      
    "_id" : 1,
    "pic" : {
        "id" : "4f1e1ab9cdf9dbaa160000be",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
});
> db.users.save({
    "_id" : 2,
    "pic" : {
        "id" : "4f1e28480eaf38193d00006e",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
});
> db.users.save({
    "_id" : 3,
    "pic" : {
        "id" : "4f1e28480eaf38193d00006e",                                                                                                                                                                                                                                                                                                                      
        "status" : "Something"
    }
});
> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray()
[
    {
        "_id" : 3,
        "pic" : {
            "id" : "4f1e28480eaf38193d00006e",
            "status" : "Something"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

仅返回包含 "pic.status":"Something" 的文档。

我唯一的想法是,您是否绝对确定查询中的 (null) 值与文档中保存的值相同?文档是使用 JS shell 保存的,还是使用其他语言的驱动程序保存的?理论上,null,应该是null,应该是null,在任何语言中,但我知道不同的语言表示“无值”的方式不同。例如,在 python 中,“无值”的值为 (None)。(null) 在 python 中不被识别。

在 python shell 中,我尝试使用 (null) 作为值保存文档,但收到错误:

In [13]: coll.save({"_id":5, "pic":{"id":5, "status":null}})
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/Users/mbastien/mongodb-osx-x86_64-2.0.1/bin/<ipython-input-13-1ad232456c88> in <module>()
----> 1 coll.save({"_id":5, "pic":{"id":5, "status":null}})

NameError: name 'null' is not defined
Run Code Online (Sandbox Code Playgroud)

然后我插入(使用 Python shell)状态“null”(“null”是一个字符串)

In [15]: coll.save({"_id":5, "pic":{"id":5, "status":'null'}})
Out[15]: 5
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,当我在 JS shell 中重新运行查询时,返回了该文档,因为 'null' != null

> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray()
[
    {
        "_id" : 3,
        "pic" : {
            "id" : "4f1e28480eaf38193d00006e",
            "status" : "Something"
        }
    },
    {
        "_id" : 5,
        "pic" : {
            "status" : "null",
            "id" : 5
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

这是否与您遇到的情况类似,或者您可以在 JS shell 中 100% 重现这一情况吗?希望我们能够找到这个问题的根源!