当我发出以下查询时:
db.users.find({"pic.status" : {$ne : null} }, {"pic" : 1}).toArray()
我希望收到pic.status为非null的所有用户。但是,实际结果如下所示:
{
"_id" : ObjectId("4f1e1ab9cdf9dbaa160000bf"),
"pic" : {
"id" : "4f1e1ab9cdf9dbaa160000be",
"status" : null
}
},
{
"_id" : ObjectId("4f1e28480eaf38193d00006f"),
"pic" : {
"id" : "4f1e28480eaf38193d00006e",
"status" : null
}
}
也就是说,我收到pic.status为空的用户。我该如何解决这个问题?
答案 0 :(得分:6)
我知道这是一个老问题,可能不再相关,但由于没有接受的答案,我想我会对任何寻找答案的人发表评论。
我能够在MongoDB版本2.4.9上重现该问题。
> db.sourceListings.findOne({displayed:{$ne:null}});
{
<.. other stuff went here..>
"displayed" : null
}
问题在版本2.6.1上消失了:
> db.sourceListings.findOne();
{
<.. other stuff ..>
"displayed" : null
}
> db.sourceListings.findOne({displayed:{$ne:null}});
null
可能是在这两个版本之间修复了。
答案 1 :(得分: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"
}
}
]
仅返回包含“pic.status”:“Something”的文档。
我唯一的想法是,您是否绝对确定查询中的(null)值与文档中保存的值相同?是使用JS shell保存文档,还是使用其他语言的驱动程序保存文档?从理论上讲,null应该为null,应该为null,在任何语言中,但我知道不同的语言表示“无价值”不同。例如,在python中,“无值”的值为(无)。 (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
然后插入(使用Python shell)状态为'null'('null'为字符串)
In [15]: coll.save({"_id":5, "pic":{"id":5, "status":'null'}})
Out[15]: 5
毫不奇怪,当我在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
}
}
]
这与您遇到的情况类似,或者您可以在JS shell中重现这100%吗?希望我们能够找到这个问题的根源!
答案 2 :(得分:0)
对数组中的单个元素使用$ nin。它会表现得像你期望的那样。 KI和许多使用mongo的人一起。