当我发出以下查询时:
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为空的用户.我怎样才能解决这个问题?
我知道这是一个老问题,可能不再相关,但由于没有接受的答案,我想我会评论任何寻找答案的人.
我能够在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)
可能是在这两个版本之间的某个地方修复了.
我似乎无法重现这一点。您使用什么版本的 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% 重现这一情况吗?希望我们能够找到这个问题的根源!
| 归档时间: |
|
| 查看次数: |
10520 次 |
| 最近记录: |