Массив запросов MongoDb с нулевыми значениями
У меня есть объекты в моей коллекции, которые выглядят так:
{ MyArray:[null, "some value", null] }
Я хочу запросить те объекты, которые имеют нулевое значение в качестве элемента массива. Запрос
db.collection.find({"MyArray":null})
не работает, кажется, что только объекты с MyArray равны нулю, например
{ MyArray:null }
Как мне определить мой запрос?
РЕДАКТИРОВАТЬ: Пожалуйста, посмотрите один из моих реальных объектов:
{
"_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
"PeerGroup" : "male",
"ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
"CategoryIds" : [
BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
],
"ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
"BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
"Created" : ISODate("2012-08-24T07:42:12.416Z"),
"LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
"Price" : 129.9,
"Sale" : false,
"Rating" : 11.057340703605368,
"RatingTimed" : 0.05670431130054035,
"Available" : null,
"FreeDelivery" : null,
"Attrs" : [
null,
null,
null,
null
]
}
И тогда я запрашиваю по:
db.collection.find({"Attrs":null})
который не дает результатов.
4 ответа
Хорошо, я понял это, загрузив своих "нулевых" кандидатов через мой драйвер C#, и оказалось, что значения не нулевые, а Bson Undefined!! Они отображаются как "ноль" в оболочке! См. http://jira.mongodb.org/browse/SERVER-2426. Это работает:
db.xxx.find({"Attrs":{$type:6}})
Чтобы найти документы с массивами, с нулевыми элементами, пожалуйста, запустите:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
По словам сафарибуксона null
сопоставление выполняется с использованием $in
(потому что вы не можете использовать $eq
с null
). Также, сравнивая с null
:
{"something":null}
будет сопоставлять документы с полем "что-то", установленным на ноль, и каждым документом, у которого вообще нет поля "что-то". Таким образом, мы должны убедиться, что ключ существует, используя $exists
,
Запрос MongoDb с фильтром нулевых значений:
{field: {$in: [null]}}
(не совсем ответ, но не вписывается в комментарий)
Я не могу воспроизвести проблему, я скопировал ваши данные в оболочку mongo и попробовал в MongoDB версии 2.2.3, 2.4.1 и здесь в 2.4.0:
Версия оболочки MongoDB: 2.4.0 подключение к: тест
> db.version()
2.4.0
> db.xxx.insert({
... "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
... "PeerGroup" : "male",
... "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
... "CategoryIds" : [
... BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
... BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
... BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
... BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
... ],
... "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
... "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
... "Created" : ISODate("2012-08-24T07:42:12.416Z"),
... "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
... "Price" : 129.9,
... "Sale" : false,
... "Rating" : 11.057340703605368,
... "RatingTimed" : 0.05670431130054035,
... "Available" : null,
... "FreeDelivery" : null,
... "Attrs" : [
... null,
... null,
... null,
... null
... ]
... }
... )
> db.xxx.find({"Attrs":null}).pretty()
{
"_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
"PeerGroup" : "male",
"ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
"CategoryIds" : [
BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
],
"ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
"BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
"Created" : ISODate("2012-08-24T07:42:12.416Z"),
"LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
"Price" : 129.9,
"Sale" : false,
"Rating" : 11.057340703605368,
"RatingTimed" : 0.05670431130054035,
"Available" : null,
"FreeDelivery" : null,
"Attrs" : [
null,
null,
null,
null
]
}
Пожалуйста, скопируйте приведенную выше последовательность в вашу оболочку Монго и опубликуйте результаты здесь.