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

时间:2012-04-03 14:15:32

标签: mongodb null

当我发出以下查询时:

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为空的用户。我该如何解决这个问题?

3 个答案:

答案 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的人一起。