Відповіді:
Це поверне всі документи з ключем під назвою "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 : введіть бажану назву колекції
ім'я поля : введіть потрібне ім’я поля
Пояснення:
$ існує : Коли це правда, $ існує відповідність документам, що містять поле, включаючи документи, у яких значення поля є нульовим. Якщо помилково, запит повертає лише документи, які не містять поля.
$ 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}});
Тому що pymongo представляє mongo "null" як python "None".
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"})
Спільний доступ для майбутніх читачів.
Цей запит працював у нас (запит, виконаний з компаса MongoDB ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
В ідеальному випадку, ви хочете перевірити всі три значення , нульові , "" або порожні (поле не існує в записі)
Ви можете зробити наступне.
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
Альтернатива, про яку не згадувалося, але може бути більш ефективним варіантом для деяких (не буде працювати з записами 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), тому будь ласка, використовуйте їх лише за потреби.
Найпростіший спосіб перевірити існування стовпця в компасі mongo:
{ '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