Как вы запрашиваете "не является нулевым" в Монго? - PullRequest
318 голосов
/ 30 октября 2010

Я хотел бы выполнить следующий запрос:

db.mycollection.find(HAS IMAGE URL)

Какой должен быть правильный синтаксис?

Ответы [ 8 ]

685 голосов
/ 15 марта 2011

Это вернет все документы с ключом, называемым «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})
40 голосов
/ 13 июня 2013

В pymongo вы можете использовать:

db.mycollection.find({"IMAGE URL":{"$ne":None}});

Поскольку pymongo представляет mongo "null" как python "None".

39 голосов
/ 12 июля 2018

Один лайнер лучший:

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });

Здесь

mycollection : укажите название нужной коллекции

имя поля : укажите желаемое имя поля

Объяснение:

$ существует : когда значение true, $ существует соответствует документам, которые содержат поле, включая документы, в которых значение поля равно нулю. Если значение равно false, запрос возвращает только те документы, которые не содержат поля.

$ ne выбирает документы, в которых значение поля не равно указанному значению. Это включает в себя документы, которые не содержат поле.

Таким образом, в предоставленном вами случае следующий запрос, возвращающий все документы с полем imageurl, существует и имеет ненулевое значение:

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
14 голосов
/ 16 июля 2017

db.collection_name.find({"filed_name":{$exists:true}});

извлекать документы, которые содержат это имя_файла, даже если оно пустое.

Мое предложение:

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String

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

N.b : если у field_name есть пустая строка, означающая "", она будет возвращена. Это то же самое поведение для db.collection_name.find({"filed_name":{$ne:null}});

Дополнительная проверка:

Хорошо, мы еще не закончили, нам нужно дополнительное условие.

db.collection_name. find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

OR

db.collection_name. find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

Справочник для всех типов: https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type

11 голосов
/ 10 января 2018

Обмен для будущих читателей.

Этот запрос работал для нас (запрос выполнен из MongoDB compass ):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}
2 голосов
/ 06 марта 2018
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
2 голосов
/ 20 октября 2014

Альтернатива, которая не была упомянута, но которая может быть более эффективной для некоторых (не будет работать с пустыми записями), заключается в использовании разреженного индекса (записи в индексе существуют только тогда, когда в поле что-то есть). Вот пример набора данных:

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), поэтому, пожалуйста, используйте только когда это уместно.

0 голосов
/ 04 января 2011

Запрос будет

db.mycollection.find({"IMAGE URL":{"$exists":"true"}})

, он вернет все документы, имеющие в качестве ключа «ИЗОБРАЖЕНИЕ URL» ...........

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