Я не верю, что это изменилось. При проверке $ ne значение проверяется во всех документах, включая те, которые не содержат поле, но $ ne: null по-прежнему не будет соответствовать документу, который не содержит поле, поскольку значение поля по-прежнему равно нулю, хотя поле не существует в этом документе.
Тим Готье
2
Как вы просто сопоставить второй документ?
BT
1
@River Я проверил, когда писал это 3 года назад, и, чтобы быть уверенным, я просто установил Mongo и попробовал снова. Это все еще работает так же, ответ правильный. От 2-го до последнего запроса возвращается только 1-й документ.
Тим Готье
1
Приведенные примеры позволяют понять, как это использовать. :-)
mycollection : укажите название нужной вам коллекции
fieldname : укажите желаемое имя поля
Объяснение:
$ exist : когда true, $ существующие соответствует документам, которые содержат поле, включая документы, в которых значение поля равно нулю. Если false, запрос возвращает только те документы, которые не содержат поле.
$ ne выбирает документы, где значение поля не равно указанному значению. Это включает в себя документы, которые не содержат поле.
Таким образом, в предоставленном вами случае следующий запрос, который будет возвращать все документы с полем imageurl, существует и имеет ненулевое значение:
Вы можете проверить тип требуемого атрибута, он вернет все документы, в которых запрашивается его field_name, содержащее значение, потому что вы проверяете тип поля, иначе, если он нулевой, условие типа не совпадает, поэтому ничего не будет возвращено.
Nb : если у field_name есть пустая строка, которая означает «», она будет возвращена. Это то же самое поведение для
Альтернативой, которая не была упомянута, но которая может быть более эффективной для некоторых (не будет работать с пустыми значениями), является использование разреженного индекса (записи в индексе существуют, только если в поле есть что-то). Вот пример набора данных:
Теперь всегда есть шанс (и, в частности, для небольшого набора данных, такого как мой образец), что вместо использования индекса MongoDB будет использовать сканирование таблицы даже для запроса индекса с потенциальным покрытием. Как оказалось, это дает мне простой способ проиллюстрировать разницу здесь:
И есть результат, который мы искали - возвращаются только документы с заполненным полем. При этом также используется только индекс (т. Е. Это закрытый индексный запрос), поэтому для возврата результатов в память должен быть только индекс.
Это специализированный вариант использования, и его нельзя использовать вообще (другие варианты см. В других ответах). В частности, следует отметить, что, поскольку вещи стоят, вы не можете использовать count()таким образом (для моего примера это вернет 6, а не 4), поэтому, пожалуйста, используйте только при необходимости.
Проблема с этим заключается в том, что предполагается, что поле действительно никогда не сохранялось, но OP, по-видимому, указывает (из заголовка), что оно может существовать, но явно установлено в ноль.
@dorvak точно, поэтому это не будет удовлетворять сценарию использования в вопросе.
kilianc
Этот ответ является неправильным , потому что $existsпроверка на ключ "IMAGE URL"и не считает , что это значение ( null) и будет возвращать документ "IMAGE URL" : null.
{ field : {$ne : null} }
проверка запроса на ненулевое docs.mongodb.org/manual/reference/operator/query/neОтветы:
Это вернет все документы с ключом «IMAGE URL», но они могут все еще иметь нулевое значение.
Это вернет все документы с ключом «IMAGE URL» и ненулевым значением.
Также, согласно документам, $ существующие в настоящее время не могут использовать индекс, но $ ne может.
Изменить: Добавление некоторых примеров из-за интереса к этому ответу
Учитывая эти вставки:
Это вернет все три документа:
Это вернет только первый и второй документы:
Это вернет только первый документ:
Это вернет только второй и третий документы:
источник
$ne
включены документы, которые не содержат поля . Изменилось ли это с тех пор, как вы опубликовали ответ? docs.mongodb.org/manual/reference/operator/query/neОдин лайнер самый лучший:
Вот,
mycollection : укажите название нужной вам коллекции
fieldname : укажите желаемое имя поля
Объяснение:
$ exist : когда true, $ существующие соответствует документам, которые содержат поле, включая документы, в которых значение поля равно нулю. Если false, запрос возвращает только те документы, которые не содержат поле.
$ ne выбирает документы, где значение поля не равно указанному значению. Это включает в себя документы, которые не содержат поле.
Таким образом, в предоставленном вами случае следующий запрос, который будет возвращать все документы с полем imageurl, существует и имеет ненулевое значение:
источник
$exists: true
избыточно,$ne: null
достаточно.$exists: true
возвращаетnull
значения тоже. Там должно быть и то$exists: true
и другое$ne: null
. Это НЕ избыточно.В пимонго вы можете использовать:
Потому что пимонго представляет монго "ноль" как питона "None".
источник
извлекать документы, которые содержат это имя_файла, даже если оно пустое.
Мое предложение:
Вы можете проверить тип требуемого атрибута, он вернет все документы, в которых запрашивается его field_name, содержащее значение, потому что вы проверяете тип поля, иначе, если он нулевой, условие типа не совпадает, поэтому ничего не будет возвращено.
Nb : если у field_name есть пустая строка, которая означает «», она будет возвращена. Это то же самое поведение для
Дополнительная проверка:
Итак, мы еще не закончили, нам нужно дополнительное условие.
ИЛИ
Ссылка
источник
Этот запрос работал для нас (запрос, выполненный из компаса MongoDB ):
источник
источник
В идеальном случае вы хотите проверить все три значения : null , "" или пустое (поле не существует в записи)
Вы можете сделать следующее.
источник
Альтернативой, которая не была упомянута, но которая может быть более эффективной для некоторых (не будет работать с пустыми значениями), является использование разреженного индекса (записи в индексе существуют, только если в поле есть что-то). Вот пример набора данных:
Теперь создайте разреженный индекс в поле imageUrl:
Теперь всегда есть шанс (и, в частности, для небольшого набора данных, такого как мой образец), что вместо использования индекса MongoDB будет использовать сканирование таблицы даже для запроса индекса с потенциальным покрытием. Как оказалось, это дает мне простой способ проиллюстрировать разницу здесь:
Итак, дополнительные документы без
imageUrl
возвращаются, только пустые, а не то, что мы хотели. Просто чтобы подтвердить почему, сделайте объяснение:Так что, да,
BasicCursor
равно сканированию таблицы, он не использовал индекс. Давайте заставим запрос использовать наш разреженный индекс сhint()
:И есть результат, который мы искали - возвращаются только документы с заполненным полем. При этом также используется только индекс (т. Е. Это закрытый индексный запрос), поэтому для возврата результатов в память должен быть только индекс.
Это специализированный вариант использования, и его нельзя использовать вообще (другие варианты см. В других ответах). В частности, следует отметить, что, поскольку вещи стоят, вы не можете использовать
count()
таким образом (для моего примера это вернет 6, а не 4), поэтому, пожалуйста, используйте только при необходимости.источник
Самый простой способ проверить наличие столбца в монго-компасе:
источник
запрос будет
он вернет все документы, имеющие «IMAGE URL» в качестве ключа ...........
источник
$exists
проверка на ключ"IMAGE URL"
и не считает , что это значение (null
) и будет возвращать документ"IMAGE URL" : null
.