Mongo: temukan item yang tidak memiliki field tertentu


107

Bagaimana cara mencari dokumen dalam koleksi yang kehilangan bidang tertentu di MongoDB?

Jawaban:


171

Ya, itu mungkin menggunakan $ ada :

db.things.find( { a : { $exists : false } } ); // return if a is missing

Jika benar, $ existing cocok dengan dokumen yang berisi bidang, termasuk dokumen yang nilai bidangnya null. Jika salah, kueri hanya mengembalikan dokumen yang tidak berisi bidang.


1
Berhati-hatilah, $existkueri tidak dapat menggunakan indeks (lihat mongodb.org/display/DOCS/… ).
Theo

4
@Theo: Mulai dari MongoDB 2.0 $ ada dapat menggunakan indeks ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich

Saya mencari ini untuk digunakan Mongoid dalam sebuah scope. Terlihat seperti ini>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Jika Anda tidak peduli jika bidangnya hilang atau null(atau jika tidak pernah null) maka Anda dapat menggunakan yang sedikit lebih pendek dan lebih aman:

db.things.find( { a : null } ); // return if a is missing or null

Ini lebih aman karena $existsakan kembali truemeskipun bidangnya kosong, yang seringkali bukan hasil yang diinginkan dan dapat menyebabkan NPE.


1
Namun, seseorang yang membaca kode mungkin menafsirkannya karena bidang tersebut harus sama nulldan tidak hilang. Ini sebenarnya adalah perilaku yang tidak terduga, karena Anda tidak akan dapat melakukan hal yang sama untuk 0(yang juga false), begitu nulljuga jenis pengecualian di sini. Oleh karena itu, praktik terbaik adalah menggunakan jawaban $exists: falseyang lebih mudah dibaca yang tidak ambigu. Ingat, varian Anda yang sedikit lebih pendek sebenarnya tidak lebih pendek jika Anda perlu memiliki komentar di baliknya!
Yeti

@Yeti jika tujuan saya adalah untuk menemukan semua benda yang hilang nilai untuk bidang a, baik karena aini nullatau karena ahilang, maka $existstidak cukup baik, karena tidak akan menangkap kasus di mana aadalah null.
nilskp
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.