Как вы запрашиваете «не является нулевым» в Монго?


Ответы:


813

Это вернет все документы с ключом «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})

13
Согласно документам, $ne включены документы, которые не содержат поля . Изменилось ли это с тех пор, как вы опубликовали ответ? docs.mongodb.org/manual/reference/operator/query/ne
Эндрю Мао

2
Я не верю, что это изменилось. При проверке $ ne значение проверяется во всех документах, включая те, которые не содержат поле, но $ ne: null по-прежнему не будет соответствовать документу, который не содержит поле, поскольку значение поля по-прежнему равно нулю, хотя поле не существует в этом документе.
Тим Готье

2
Как вы просто сопоставить второй документ?
BT

1
@River Я проверил, когда писал это 3 года назад, и, чтобы быть уверенным, я просто установил Mongo и попробовал снова. Это все еще работает так же, ответ правильный. От 2-го до последнего запроса возвращается только 1-й документ.
Тим Готье

1
Приведенные примеры позволяют понять, как это использовать. :-)
Эрик Дела Круз

92

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

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

Вот,

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

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

Объяснение:

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

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

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

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

11
$exists: trueизбыточно, $ne: nullдостаточно.
Станислав Караханов

Это должен быть лучший ответ. $exists: trueвозвращает nullзначения тоже. Там должно быть и то $exists: trueи другое $ne: null. Это НЕ избыточно.
Исмаил Каттакат

47

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

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

Потому что пимонго представляет монго "ноль" как питона "None".


18
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"})

Ссылка


14

Поделиться для будущих читателей.

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

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}

1
{$ exist: true, $ ne: null} не показало правильный результат. Ваш запрос работает хорошо
Александр Бучек

1
Будьте осторожны, $ nin часто не оптимизируется по индексам
Wheezil

4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})

Это действительный документ Json? Два свойства с одинаковым именем в документе запроса. Не уверен, как бы вы встроили это в память, если бы пришлось.
BrentR

4

В идеальном случае вы хотите проверить все три значения : null , "" или пустое (поле не существует в записи)

Вы можете сделать следующее.

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

3

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

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


текстовые поля всегда разреженные индексы, вам не нужно указывать это явно. только мои 2 цента.
alianos-

3

Самый простой способ проверить наличие столбца в монго-компасе:

{ 'column_name': { $exists: true } }

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

-10

запрос будет

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

он вернет все документы, имеющие «IMAGE URL» в качестве ключа ...........


1
@kilianc Это не правда. $ Существуют также и нулевые значения. См. Docs.mongodb.org/manual/reference/operator/query/exists
dorvak

@dorvak точно, поэтому это не будет удовлетворять сценарию использования в вопросе.
kilianc

Этот ответ является неправильным , потому что $existsпроверка на ключ "IMAGE URL"и не считает , что это значение ( null) и будет возвращать документ "IMAGE URL" : null.
Дэвид Харири
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.