Як ви запитуєте "не нуль" у Монго?


Відповіді:


812

Це поверне всі документи з ключем під назвою "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})

12
Згідно з документами, $ne включає документи, які не містять поля . Чи змінилося це з моменту опублікування відповіді? docs.mongodb.org/manual/reference/operator/query/ne
Ендрю Мао

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

2
Як ви просто узгоджуєте другий документ?
BT

1
@River Я перевірив, коли я писав це 3 роки тому, і, напевно, я просто встановив Mongo і спробував це ще раз. Він все одно працює так само, відповідь правильна. Другий запит повертає лише перший документ.
Тім Готьє

1
Наведені приклади дозволяють зрозуміти, як це використовувати. :-)
Ерік Дела Крус

92

Один лайнер найкращий:

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

Ось

mycollection : введіть бажану назву колекції

ім'я поля : введіть потрібне ім’я поля

Пояснення:

$ існує : Коли це правда, $ існує відповідність документам, що містять поле, включаючи документи, у яких значення поля є нульовим. Якщо помилково, запит повертає лише документи, які не містять поля.

$ 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}});

Тому що pymongo представляє mongo "null" як python "None".


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

витягувати документи, які містять це file_name, навіть це недійсне.

Моя пропозиція:

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
{$ існує: true, $ ne: null} не показав правильний результат. Ваш запит працює добре
Олександр Бучек

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

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

Це дійсний документ Json? Дві властивості з тим самим іменем у документі запиту. Не впевнений, як би ви створили це в пам’яті, якби це зробили.
BrentR

4

В ідеальному випадку, ви хочете перевірити всі три значення , нульові , "" або порожні (поле не існує в записі)

Ви можете зробити наступне.

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

3

Альтернатива, про яку не згадувалося, але може бути більш ефективним варіантом для деяких (не буде працювати з записами NULL), - використовувати розріджений індекс (записи в індексі існують лише тоді, коли в полі є щось). Ось набір зразків даних:

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 копійки.
аліанос-

3

Найпростіший спосіб перевірити існування стовпця в компасі mongo:

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

1
Проблема в цьому полягає в тому, що він передбачає, що поле справді ніколи не зберігалося, але ОП, здається, вказує (з заголовка), що воно може існувати, але встановлюється на явну нуль.
Каріган

-10

Запит буде

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

він поверне всі документи, що мають в якості ключа "IMAGE URL" ...........


1
@kilianc Це неправда. $ postoji також захоплює нульові значення. Дивіться 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.