Mongo: temukan item yang tidak memiliki field tertentu

107

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

bcmcfc.dll
sumber

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.

Andrew Orsich
sumber
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.

nilskp
sumber
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