Mongo'daki “is not null” kelimesini nasıl sorgulayabilirsiniz?


Yanıtlar:


812

Bu, "IMAGE URL" adlı bir anahtarı olan tüm dokümanları döndürür, ancak yine de null değerine sahip olabilirler.

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

Bu "GÖRÜNTÜ URL" olarak adlandırılan bir anahtarla hem tüm belgeleri döndürecektir ve boş olmayan bir değere.

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

Ayrıca, dokümanlara göre, $ available şu anda bir dizin kullanamıyor, ancak $ ne kullanabilir.

Düzenleme: Bu cevaba olan ilgi nedeniyle bazı örnekler ekleme

Bu uçlar göz önüne alındığında:

db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});

Bu, her üç belgeyi de döndürür:

db.test.find();

Bu yalnızca birinci ve ikinci belgeleri döndürür:

db.test.find({"check":{$exists:true}});

Bu yalnızca ilk belgeyi döndürür:

db.test.find({"check":{$ne:null}});

Bu yalnızca ikinci ve üçüncü belgeleri döndürür:

db.test.find({"check":null})

13
Dokümanlara göre $ne , alanı içermeyen dokümanları içerir . Cevabı gönderdiğin için bu değişti mi? docs.mongodb.org/manual/reference/operator/query/ne
Andrew Mao

2
Bunun değiştiğine inanmıyorum. $ Ne kontrol edilirken değer, alanı içermeyenler de dahil olmak üzere tüm belgelerde kontrol edilir, ancak $ ne: null, alan değeri hala bulunmadığından alan içermeyen bir belgeyle eşleşmez, alan bu belgede bulunmamasına rağmen.
Tim Gautier

2
İkinci belgeyle nasıl eşleşiyorsunuz?
BT

1
@River Bunu 3 yıl önce yazdığımda kontrol ettim ve emin olmak için Mongo'yu yeni kurdum ve tekrar denedim. Hala aynı şekilde çalışıyor, cevap doğru. Sondan ikinci sorgu yalnızca 1. belgeyi döndürür.
Tim Gautier

1
Verilen örnekler, bunun nasıl kullanılacağını gerçekten anlaşılır kılmaktadır. :-)
Eric Dela Cruz

92

Bir astar en iyisidir:

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });

Buraya,

mycollection : istediğiniz koleksiyon adını girin

alan adı : İstediğiniz alan adını yerleştirmek

Açıklama:

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

$ ne , alanın değerinin belirtilen değere eşit olmadığı belgeleri seçer. Bu, alanı içermeyen belgeleri içerir.

Bu nedenle, sağladığınız durumda, imageurl alanı olan ve null değeri olmayan tüm dokümanları döndürecek aşağıdaki sorgu var:

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });

11
$exists: truegereksizdir, $ne: nullyeterlidir.
Stanislav Karakhanov

Bu en iyi cevap olmalı. değerleri de $exists: truedöndürür null. Her iki olmalı $exists: trueve $ne: null. Gereksiz değil.
Ismail Kattakath

47

Pymongo'da şunları kullanabilirsiniz:

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

Çünkü pymongo "Hiçbiri" pitonu olarak "null" mongoyu temsil eder.


18
db.collection_name.find({"filed_name":{$exists:true}});

dosyalanmış_adı içeren belgeleri boş olsa bile getir.

Benim önerim:

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String

Gerekli özniteliğin türünü kontrol edebilirsiniz, alan_adı sorgulanan tüm belgeleri bir değer içerdiğinden döndürür, çünkü dosya türünün boş olması durumunda başka türün türünü kontrol etmezsiniz, böylece hiçbir şey döndürülmez.

Nb : alan_adı hangi araçlar "" boş bir dize varsa, o returned.It için aynı davranıştır olacak

db.collection_name.find({"filed_name":{$ne:null}});

Ek doğrulama:

Tamam, bu yüzden henüz bitirmedik ekstra bir koşula ihtiyacımız var.

db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

VEYA

db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

Referans



4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})

Bu geçerli bir Json belgesi mi? Sorgu belgesinde aynı ada sahip iki özellik. Gerekirse bunu hafızada nasıl oluşturacağınızdan emin değilim.
BrentR

4

İdeal durumda , null , "" veya boş olan üç değeri de test etmek istersiniz (alan kayıtlarında mevcut değil)

Aşağıdakileri yapabilirsiniz.

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

3

Daha önce bahsedilmeyen ancak bazıları için daha verimli bir seçenek olabilecek (NULL girişlerle çalışmaz) bir alternatif, seyrek bir dizin kullanmaktır ( dizindeki girişler yalnızca alanda bir şey olduğunda mevcuttur). Aşağıda örnek bir veri kümesi verilmiştir:

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 }

Şimdi, imageUrl alanında seyrek dizin oluşturun:

db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

Şimdi, her zaman bir dizin kullanmak yerine, MongoDB'nin olası bir kapalı dizin sorgusu için bile bir tablo taraması kullanma şansı vardır (ve özellikle örneğim gibi küçük bir veri kümesiyle). Anlaşıldığı üzere, buradaki farkı göstermek için bana kolay bir yol sunuyor:

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" }
{  }
{  }

Tamam, böylece ekstra belgeler imageUrliade edilmez, sadece boş, istediğimizi değil. Sadece nedenini doğrulamak için bir açıklama yapın:

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
}

Yani, evet, bir BasicCursortablo taramasına eşittir, dizini kullanmadı. Sorguyu seyrek dizinimizi aşağıdakilerle kullanmaya zorlayalım 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" }

Ve aradığımız sonuç var - sadece alanı doldurulmuş belgeler iade edilir. Bu aynı zamanda yalnızca dizini kullanır (yani, kapalı bir dizin sorgusudur), bu nedenle sonuçları döndürmek için yalnızca dizinin bellekte olması gerekir.

Bu özel bir kullanım durumudur ve genellikle kullanılamaz (bu seçenekler için diğer yanıtlara bakın). Özellikle, şeyler durdukça count()bu şekilde kullanamayacağınıza dikkat edilmelidir (örneğim için 6 değil 4 döndürecektir), bu yüzden lütfen sadece uygun olduğunda kullanın.


metin alanları her zaman seyrek dizinlerdir, bunu açıkça belirtmeniz gerekmez. sadece 2 sentim.
alianos-

3

Mongo pusulasında sütunun varlığını kontrol etmenin en basit yolu:

{ 'column_name': { $exists: true } }

1
Buradaki problem, alanın gerçekten asla devam etmediğini varsayması, ancak OP'nin (başlıktan) var olabileceğini, ancak açıkça null olarak ayarlandığını gösteriyor gibi görünüyor.
Carighan

-10

Sorgu

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

"IMAGE URL'si" olan tüm dokümanları anahtar olarak döndürür ...........


1
@kilianc Bu doğru değil. $ available da null değerleri yakalayacaktır. Bkz. Docs.mongodb.org/manual/reference/operator/query/exists
dorvak

@ dorvak tam olarak, bu yüzden sorudaki kullanım durumunu tatmin etmeyecek.
kilianc

Bunun nedeni cevap yanlış $existsanahtar için denetler "IMAGE URL"ve 's değerini (dikkate almaz null) ve edecek olan bir belgeyi iade "IMAGE URL" : null.
David Hariri
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.