Bagaimana Anda meminta "bukan nol" di Mongo?

Jawaban:

813

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})
Tim Gautier
sumber
13
Menurut dokumen, $ne termasuk dokumen yang tidak mengandung bidang . Apakah ini sudah berubah sejak Anda memposting jawabannya? docs.mongodb.org/manual/reference/operator/query/ne
Andrew Mao
2
Saya tidak percaya itu telah berubah. Saat memeriksa $ ne, nilainya diperiksa di semua dokumen, termasuk yang tidak mengandung bidang, tetapi $ ne: null masih tidak akan cocok dengan dokumen yang tidak berisi bidang karena nilai bidang masih nol, meskipun bidang tidak ada dalam dokumen itu.
Tim Gautier
2
Bagaimana cara Anda mencocokkan dokumen kedua?
BT
1
@River saya memeriksa ketika saya menulis ini 3 tahun yang lalu dan, untuk memastikan, saya baru saja menginstal Mongo dan mencobanya lagi. Masih bekerja dengan cara yang sama, jawabannya sudah benar. Permintaan ke-2 hingga terakhir hanya mengembalikan dokumen ke-1.
Tim Gautier
1
Contoh-contoh yang diberikan membuatnya sangat dimengerti bagaimana menggunakan ini. :-)
Eric Dela Cruz
92

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 } });
Amitesh
sumber
11
$exists: trueberlebihan, $ne: nullsudah cukup.
Stanislav Karakhanov
Ini harus menjadi jawaban terbaik. $exists: truemengembalikan nullnilai juga. Harus ada keduanya $exists: truedan $ne: null. BUKAN berlebihan.
Ismail Kattakath
47

Di pymongo Anda dapat menggunakan:

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

Karena pymongo mewakili mongo "null" sebagai python "None".

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

Referensi

Farouk El kholy
sumber
14

Berbagi untuk pembaca masa depan.

Kueri ini berfungsi untuk kami (kueri dieksekusi dari kompas MongoDB ):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}
Mohammed Zameer
sumber
1
{$ exist: true, $ ne: null} tidak menunjukkan hasil yang benar. Permintaan Anda berfungsi baik
Oleksandr Buchek
1
Hati-hati, $ nin sering tidak mengoptimalkan indeks
Wheezil
4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
Berhanu Tarekegn
sumber
Apakah ini dokumen Json yang valid? Dua properti dengan nama yang sama dalam dokumen permintaan. Tidak yakin bagaimana Anda akan membangun itu dalam memori jika Anda harus.
BrentR
4

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}}]})
Ankit Marothi
sumber
3

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 imageUrlada 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, BasicCursorsama 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.

Adam Comerford
sumber
bidang teks selalu jarang indeks, Anda tidak perlu menentukannya secara eksplisit. hanya 2 sen saya.
alianos-
3

Cara paling sederhana untuk memeriksa keberadaan kolom di kompas mongo adalah:

{ 'column_name': { $exists: true } }
Taha Hamedani
sumber
1
Masalah dengan ini adalah bahwa ia mengasumsikan lapangan benar-benar tidak pernah bertahan, tetapi OP tampaknya menunjukkan (dari informasi utama) bahwa itu bisa ada tetapi diatur ke nol secara eksplisit.
Carighan
-10

Query Will be

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

itu akan mengembalikan semua dokumen yang memiliki "URL IMAGE" sebagai kunci ...........

Sagar Varpe
sumber
1
@kilianc Itu tidak benar. $ exist akan menangkap nilai null juga. Lihat docs.mongodb.org/manual/reference/operator/query/exists
dorvak
@dorvak tepatnya, itu sebabnya itu tidak akan memuaskan use case dalam pertanyaan.
kilianc
Jawaban ini salah karena $existsmemeriksa kunci "IMAGE URL"dan tidak menganggap nilainya ( null) dan akan mengembalikan dokumen "IMAGE URL" : null.
David Hariri