Mongo {$ ne: null} не работает должным образом - PullRequest
6 голосов
/ 03 апреля 2012

Когда я выдаю следующий запрос:

db.users.find({"pic.status" : {$ne : null} }, {"pic" : 1}).toArray()

Я ожидаю получить всех пользователей, чей pic.status НЕ является нулевым. Однако фактический результат выглядит примерно так:

{                                                                                                                                      
    "_id" : ObjectId("4f1e1ab9cdf9dbaa160000bf"),
    "pic" : {
        "id" : "4f1e1ab9cdf9dbaa160000be",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
},
{
    "_id" : ObjectId("4f1e28480eaf38193d00006f"),
    "pic" : {
        "id" : "4f1e28480eaf38193d00006e",                                                                                                                                                                                                                                                                                                                      
        "status" : null
    }
}

То есть я получаю пользователей, чье pic.status равно NULL. Как я могу это исправить?

Ответы [ 3 ]

6 голосов
/ 03 июля 2014

Я знаю, что это старый вопрос и, возможно, он больше не актуален, но поскольку не было принятого ответа, я подумал, что прокомментирую всех, кто ищет ответ.

Мне удалось воспроизвести проблемув 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

Возможно, она была исправлена ​​где-то между этими двумя версиями.

2 голосов
/ 03 апреля 2012

Я не могу воспроизвести это.Какую версию Mongo вы используете?(Я использую 2.1.1-pre) Вот шаги, которые я предпринял.Следующее из оболочки JS:

> 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 или они были сохранены с использованием драйвера на другом языке?Теоретически, null, должно быть null, должно быть null, на любом языке, но я знаю, что разные языки представляют «нет значения» по-разному.Например, в python значением для «no value» является (None).(ноль) не распознается в Python.

В оболочке Python я попытался сохранить документ со значением (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) статусиз 'null' ('null' - строка)

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

Не удивительно, что когда я перезапустил запрос в оболочке JS, этот документ был возвращен, потому что '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
        }
    }
]

Это похоже на то, что вы испытываете, или вы можете воспроизвести это 100% в оболочке JS?Надеемся, мы сможем добраться до корня этой проблемы!

0 голосов
/ 03 июня 2013

Используйте $ nin с одним элементом в массиве. Он будет вести себя так, как вы ожидаете. KI со многими из людей, которые используют монго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...