Ответы:
Это вернет все документы с ключом «IMAGE URL», но они могут все еще иметь нулевое значение.
db.mycollection.find({"IMAGE URL":{$exists:true}});
Это вернет все документы с ключом «IMAGE URL» и ненулевым значением.
db.mycollection.find({"IMAGE URL":{$ne:null}});
Также, согласно документам, $ существующие в настоящее время не могут использовать индекс, но $ ne может.
Изменить: Добавление некоторых примеров из-за интереса к этому ответу
Учитывая эти вставки:
db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});
Это вернет все три документа:
db.test.find();
Это вернет только первый и второй документы:
db.test.find({"check":{$exists:true}});
Это вернет только первый документ:
db.test.find({"check":{$ne:null}});
Это вернет только второй и третий документы:
db.test.find({"check":null})
$ne
включены документы, которые не содержат поля . Изменилось ли это с тех пор, как вы опубликовали ответ? docs.mongodb.org/manual/reference/operator/query/ne
Один лайнер самый лучший:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
Вот,
mycollection : укажите название нужной вам коллекции
fieldname : укажите желаемое имя поля
Объяснение:
$ exist : когда true, $ существующие соответствует документам, которые содержат поле, включая документы, в которых значение поля равно нулю. Если false, запрос возвращает только те документы, которые не содержат поле.
$ ne выбирает документы, где значение поля не равно указанному значению. Это включает в себя документы, которые не содержат поле.
Таким образом, в предоставленном вами случае следующий запрос, который будет возвращать все документы с полем imageurl, существует и имеет ненулевое значение:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
$exists: true
избыточно, $ne: null
достаточно.
$exists: true
возвращает null
значения тоже. Там должно быть и то $exists: true
и другое $ne: null
. Это НЕ избыточно.
В пимонго вы можете использовать:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
Потому что пимонго представляет монго "ноль" как питона "None".
db.collection_name.find({"filed_name":{$exists:true}});
извлекать документы, которые содержат это имя_файла, даже если оно пустое.
Мое предложение:
db.collection_name.find({"field_name":{$type:2}}) //type:2 == String
Вы можете проверить тип требуемого атрибута, он вернет все документы, в которых запрашивается его field_name, содержащее значение, потому что вы проверяете тип поля, иначе, если он нулевой, условие типа не совпадает, поэтому ничего не будет возвращено.
Nb : если у field_name есть пустая строка, которая означает «», она будет возвращена. Это то же самое поведение для
db.collection_name.find({"filed_name":{$ne:null}});
Дополнительная проверка:
Итак, мы еще не закончили, нам нужно дополнительное условие.
db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})
ИЛИ
db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})
Поделиться для будущих читателей.
Этот запрос работал для нас (запрос, выполненный из компаса MongoDB ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
В идеальном случае вы хотите проверить все три значения : null , "" или пустое (поле не существует в записи)
Вы можете сделать следующее.
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
Альтернативой, которая не была упомянута, но которая может быть более эффективной для некоторых (не будет работать с пустыми значениями), является использование разреженного индекса (записи в индексе существуют, только если в поле есть что-то). Вот пример набора данных:
db.foo.find()
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" }
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" }
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" }
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" }
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 }
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 }
Теперь создайте разреженный индекс в поле imageUrl:
db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Теперь всегда есть шанс (и, в частности, для небольшого набора данных, такого как мой образец), что вместо использования индекса MongoDB будет использовать сканирование таблицы даже для запроса индекса с потенциальным покрытием. Как оказалось, это дает мне простой способ проиллюстрировать разницу здесь:
db.foo.find({}, {_id : 0, imageUrl : 1})
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
{ "imageUrl" : "http://example.com/bar.png" }
{ }
{ }
Итак, дополнительные документы без imageUrl
возвращаются, только пустые, а не то, что мы хотели. Просто чтобы подтвердить почему, сделайте объяснение:
db.foo.find({}, {_id : 0, imageUrl : 1}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 6,
"nscannedObjects" : 6,
"nscanned" : 6,
"nscannedObjectsAllPlans" : 6,
"nscannedAllPlans" : 6,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "localhost:31100",
"filterSet" : false
}
Так что, да, BasicCursor
равно сканированию таблицы, он не использовал индекс. Давайте заставим запрос использовать наш разреженный индекс с hint()
:
db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1})
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/bar.png" }
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
И есть результат, который мы искали - возвращаются только документы с заполненным полем. При этом также используется только индекс (т. Е. Это закрытый индексный запрос), поэтому для возврата результатов в память должен быть только индекс.
Это специализированный вариант использования, и его нельзя использовать вообще (другие варианты см. В других ответах). В частности, следует отметить, что, поскольку вещи стоят, вы не можете использовать count()
таким образом (для моего примера это вернет 6, а не 4), поэтому, пожалуйста, используйте только при необходимости.
Самый простой способ проверить наличие столбца в монго-компасе:
{ 'column_name': { $exists: true } }
запрос будет
db.mycollection.find({"IMAGE URL":{"$exists":"true"}})
он вернет все документы, имеющие «IMAGE URL» в качестве ключа ...........
$exists
проверка на ключ "IMAGE URL"
и не считает , что это значение ( null
) и будет возвращать документ "IMAGE URL" : null
.
{ field : {$ne : null} }
проверка запроса на ненулевое docs.mongodb.org/manual/reference/operator/query/ne