Jawaban:
Ini akan mengembalikan semua dokumen dengan kunci yang disebut "URL IMAGE", tetapi mereka mungkin masih memiliki nilai nol.
db.mycollection.find({"IMAGE URL":{$exists:true}});
Ini akan mengembalikan semua dokumen dengan kunci yang disebut "URL IMAGE" dan nilai yang bukan nol.
db.mycollection.find({"IMAGE URL":{$ne:null}});
Juga, menurut dokumen, $ ada saat ini tidak dapat menggunakan indeks, tetapi $ ne bisa.
Sunting: Menambahkan beberapa contoh karena minat pada jawaban ini
Diberikan sisipan ini:
db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});
Ini akan mengembalikan ketiga dokumen:
db.test.find();
Ini hanya akan mengembalikan dokumen pertama dan kedua:
db.test.find({"check":{$exists:true}});
Ini hanya akan mengembalikan dokumen pertama:
db.test.find({"check":{$ne:null}});
Ini hanya akan mengembalikan dokumen kedua dan ketiga:
db.test.find({"check":null})
$ne
termasuk dokumen yang tidak mengandung bidang . Apakah ini sudah berubah sejak Anda memposting jawabannya? docs.mongodb.org/manual/reference/operator/query/ne
Satu liner adalah yang terbaik:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
Sini,
mycollection : tempatkan nama koleksi yang Anda inginkan
fieldname : tempatkan nama field yang Anda inginkan
Penjelasan:
$ ada : When true, $ exist cocok dengan dokumen yang berisi bidang, termasuk dokumen yang nilai bidangnya nol. Jika salah, kueri hanya mengembalikan dokumen yang tidak berisi bidang.
$ ne memilih dokumen di mana nilai bidang tidak sama dengan nilai yang ditentukan. Ini termasuk dokumen yang tidak mengandung bidang.
Jadi dalam kasus yang Anda berikan, kueri berikut akan mengembalikan semua dokumen dengan bidang imageurl ada dan tidak memiliki nilai nol:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
$exists: true
berlebihan, $ne: null
sudah cukup.
$exists: true
mengembalikan null
nilai juga. Harus ada keduanya $exists: true
dan $ne: null
. BUKAN berlebihan.
Di pymongo Anda dapat menggunakan:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
Karena pymongo mewakili mongo "null" sebagai python "None".
db.collection_name.find({"filed_name":{$exists:true}});
ambil dokumen yang berisi nama_dituliskan ini walaupun itu nol.
Proposisi saya:
db.collection_name.find({"field_name":{$type:2}}) //type:2 == String
Anda dapat memeriksa pada tipe atribut yang diperlukan, itu akan mengembalikan semua dokumen yang field_name-nya di-query berisi nilai karena Anda memeriksa pada tipe yang diajukan jika null, kondisi tipe tidak cocok sehingga tidak ada yang akan dikembalikan.
Nb : jika field_name memiliki string kosong yang berarti "", itu akan dikembalikan. Ini adalah perilaku yang sama untuk
db.collection_name.find({"filed_name":{$ne:null}});
Validasi ekstra:
Oke, jadi kita belum selesai tapi kita butuh syarat ekstra.
db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})
ATAU
db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})
Berbagi untuk pembaca masa depan.
Kueri ini berfungsi untuk kami (kueri dieksekusi dari kompas MongoDB ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
Dalam kasus yang ideal, Anda ingin menguji ketiga nilai , nol , "" atau kosong (bidang tidak ada dalam catatan)
Anda dapat melakukan hal berikut.
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
Alternatif yang belum disebutkan, tetapi yang mungkin menjadi pilihan yang lebih efisien untuk beberapa (tidak akan bekerja dengan entri NULL) adalah dengan menggunakan indeks jarang (entri dalam indeks hanya ada ketika ada sesuatu di lapangan). Berikut ini adalah kumpulan data sampel:
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 }
Sekarang, buat indeks jarang pada bidang imageUrl:
db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Sekarang, selalu ada kesempatan (dan khususnya dengan kumpulan data kecil seperti sampel saya) bahwa daripada menggunakan indeks, MongoDB akan menggunakan pemindaian tabel, bahkan untuk kueri indeks tertutup yang potensial. Ternyata itu memberi saya cara mudah untuk menggambarkan perbedaan di sini:
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" }
{ }
{ }
OK, jadi dokumen tambahan tanpa imageUrl
ada dikembalikan, hanya kosong, bukan yang kita inginkan. Hanya untuk mengonfirmasi alasannya, lakukan penjelasan:
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
}
Jadi, ya, BasicCursor
sama dengan pemindaian tabel, itu tidak menggunakan indeks. Mari paksakan kueri untuk menggunakan indeks jarang kami dengan 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" }
Dan ada hasil yang kami cari - hanya dokumen dengan bidang yang dihuni yang dikembalikan. Ini juga hanya menggunakan indeks (yaitu itu adalah permintaan indeks tertutup), jadi hanya indeks yang perlu di memori untuk mengembalikan hasilnya.
Ini adalah kasus penggunaan khusus dan tidak dapat digunakan secara umum (lihat jawaban lain untuk opsi tersebut). Khususnya harus dicatat bahwa ketika barang-barang berdiri Anda tidak dapat menggunakan count()
cara ini (misalnya saya akan mengembalikan 6 bukan 4), jadi tolong gunakan hanya jika sesuai.
Cara paling sederhana untuk memeriksa keberadaan kolom di kompas mongo adalah:
{ 'column_name': { $exists: true } }
Query Will be
db.mycollection.find({"IMAGE URL":{"$exists":"true"}})
itu akan mengembalikan semua dokumen yang memiliki "URL IMAGE" sebagai kunci ...........
$exists
memeriksa kunci "IMAGE URL"
dan tidak menganggap nilainya ( null
) dan akan mengembalikan dokumen "IMAGE URL" : null
.
{ field : {$ne : null} }
pemeriksaan permintaan untuk not-null docs.mongodb.org/manual/reference/operator/query/ne