Mongo: belirli bir alanı olmayan öğeleri bulun


107

MongoDB'de belirli bir alanı eksik olan bir koleksiyondaki dokümanları nasıl arayabilirim?

Yanıtlar:


171

Evet, $ var kullanarak mümkündür :

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

Doğru olduğunda, $ var, alan değerinin boş olduğu belgeler dahil, alanı içeren belgelerle eşleşir. Yanlışsa, sorgu yalnızca alanı içermeyen belgeleri döndürür.


1
Dikkat edin, $existsorgular dizin kullanamaz (bkz. Mongodb.org/display/DOCS/… ).
Theo

4
@Theo: MongoDB 2.0 $ 'dan başlayarak, indeksleri kullanabilir ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich

Mongoid'in dürbünle kullanması için bunun peşindeydim. Buna benziyor>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Alanın eksik olması veya null(veya hiç olmaması) umurunuzda değilse null, biraz daha kısa ve daha güvenli olanı kullanabilirsiniz :

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

Daha güvenlidir, çünkü alan boş olsa bile $existsgeri döner true, bu genellikle istenen sonuç değildir ve bir NPE'ye yol açabilir.


1
Bununla birlikte, kodu okuyan biri, onu alanın eşit olması nullve eksik olmaması gerektiği şeklinde yorumlayabilir . Bu aslında beklenmeyen bir davranıştır, çünkü aynı şeyi 0(ki bu da false) için yapamazsınız, nullburadaki istisna da öyle . Bu nedenle, en iyi uygulama, $exists: falsebelirsiz olmayan daha okunabilir bir cevaptır . Unutmayın, biraz daha kısa varyantınız, arkasında bu yorumu yapmanız gerekiyorsa, aslında daha kısa değildir!
Yeti

@Yeti amacım alanı için bir değer eksik tüm nesneleri bulmak için ise aya çünkü, aolduğu nullya çünkü aeksik, o $existsda vakaları yakalamak olmayacak gibi yeterince iyi değil aise null.
nilskp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.