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. :-)
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:
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
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)
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:
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:
OK, jadi dokumen tambahan tanpa imageUrlada dikembalikan, hanya kosong, bukan yang kita inginkan. Hanya untuk mengonfirmasi alasannya, lakukan penjelasan:
Jadi, ya, BasicCursorsama dengan pemindaian tabel, itu tidak menggunakan indeks. Mari paksakan kueri untuk menggunakan indeks jarang kami dengan hint():
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.
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.
{ field : {$ne : null} }
pemeriksaan permintaan untuk not-null docs.mongodb.org/manual/reference/operator/query/neJawaban:
Ini akan mengembalikan semua dokumen dengan kunci yang disebut "URL IMAGE", tetapi mereka mungkin masih memiliki nilai nol.
Ini akan mengembalikan semua dokumen dengan kunci yang disebut "URL IMAGE" dan nilai yang bukan nol.
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:
Ini akan mengembalikan ketiga dokumen:
Ini hanya akan mengembalikan dokumen pertama dan kedua:
Ini hanya akan mengembalikan dokumen pertama:
Ini hanya akan mengembalikan dokumen kedua dan ketiga:
sumber
$ne
termasuk dokumen yang tidak mengandung bidang . Apakah ini sudah berubah sejak Anda memposting jawabannya? docs.mongodb.org/manual/reference/operator/query/neSatu liner adalah yang terbaik:
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:
sumber
$exists: true
berlebihan,$ne: null
sudah cukup.$exists: true
mengembalikannull
nilai juga. Harus ada keduanya$exists: true
dan$ne: null
. BUKAN berlebihan.Di pymongo Anda dapat menggunakan:
Karena pymongo mewakili mongo "null" sebagai python "None".
sumber
ambil dokumen yang berisi nama_dituliskan ini walaupun itu nol.
Proposisi saya:
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
Validasi ekstra:
Oke, jadi kita belum selesai tapi kita butuh syarat ekstra.
ATAU
Referensi
sumber
Kueri ini berfungsi untuk kami (kueri dieksekusi dari kompas MongoDB ):
sumber
sumber
Dalam kasus yang ideal, Anda ingin menguji ketiga nilai , nol , "" atau kosong (bidang tidak ada dalam catatan)
Anda dapat melakukan hal berikut.
sumber
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:
Sekarang, buat indeks jarang pada bidang imageUrl:
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:
OK, jadi dokumen tambahan tanpa
imageUrl
ada dikembalikan, hanya kosong, bukan yang kita inginkan. Hanya untuk mengonfirmasi alasannya, lakukan penjelasan:Jadi, ya,
BasicCursor
sama dengan pemindaian tabel, itu tidak menggunakan indeks. Mari paksakan kueri untuk menggunakan indeks jarang kami denganhint()
: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.sumber
Cara paling sederhana untuk memeriksa keberadaan kolom di kompas mongo adalah:
sumber
Query Will be
itu akan mengembalikan semua dokumen yang memiliki "URL IMAGE" sebagai kunci ...........
sumber
$exists
memeriksa kunci"IMAGE URL"
dan tidak menganggap nilainya (null
) dan akan mengembalikan dokumen"IMAGE URL" : null
.