Odpowiedzi:
Spowoduje to zwrócenie wszystkich dokumentów z kluczem o nazwie „IMAGE URL”, ale nadal mogą mieć wartość zerową.
db.mycollection.find({"IMAGE URL":{$exists:true}});
Spowoduje to zwrócenie wszystkich dokumentów z kluczem o nazwie „IMAGE URL” i wartością inną niż null.
db.mycollection.find({"IMAGE URL":{$ne:null}});
Ponadto, zgodnie z dokumentami, $ istnieje obecnie nie może używać indeksu, ale $ ne może.
Edycja: dodanie kilku przykładów ze względu na zainteresowanie tą odpowiedzią
Biorąc pod uwagę te wkładki:
db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});
Spowoduje to zwrócenie wszystkich trzech dokumentów:
db.test.find();
Zwróci tylko pierwszy i drugi dokument:
db.test.find({"check":{$exists:true}});
Zwróci tylko pierwszy dokument:
db.test.find({"check":{$ne:null}});
Zwróci tylko drugi i trzeci dokument:
db.test.find({"check":null})
$ne
obejmuje dokumenty, które nie zawierają pola . Czy zmieniło się to od czasu opublikowania odpowiedzi? docs.mongodb.org/manual/reference/operator/query/ne
Jedna wkładka jest najlepsza:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
Tutaj,
mycollection : umieść żądaną nazwę kolekcji
nazwa_pola : umieść swoją pożądaną nazwę pola
Wyjaśnienie:
$ istnieje : Kiedy jest prawdziwe, $ istnieje pasuje do dokumentów zawierających pole, w tym dokumentów, w których wartość pola jest równa null. Jeśli ma wartość false, zapytanie zwraca tylko dokumenty, które nie zawierają pola.
$ ne wybiera dokumenty, w których wartość pola nie jest równa podanej wartości. Obejmuje to dokumenty, które nie zawierają pola.
Tak więc w podanym przypadku istnieje zapytanie zwracające wszystkie dokumenty z polem imageurl, które nie mają wartości zerowej:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
$exists: true
jest zbędny, $ne: null
wystarczy.
$exists: true
zwraca null
również wartości. Musi być jedno $exists: true
i drugie $ne: null
. To NIE jest zbędne.
W pymongo możesz użyć:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
Ponieważ pymongo reprezentuje mongo „null” jako python „None”.
db.collection_name.find({"filed_name":{$exists:true}});
pobierz dokumenty zawierające tę nazwę pliku, nawet jeśli jest ona pusta.
Moja propozycja:
db.collection_name.find({"field_name":{$type:2}}) //type:2 == String
Możesz sprawdzić typ wymaganego atrybutu, zwróci on wszystkie dokumenty, których kwerenda nazwa_pola zawiera wartość, ponieważ sprawdzasz typ pliku w innym przypadku, jeśli jest pusty, warunek typu nie pasuje, więc nic nie zostanie zwrócone.
Uwaga : jeśli nazwa_pola ma pusty ciąg znaków, co oznacza „”, zostanie zwrócona. To samo zachowanie
db.collection_name.find({"filed_name":{$ne:null}});
Dodatkowa walidacja:
Okej, więc jeszcze nie skończyliśmy, potrzebujemy dodatkowego warunku.
db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})
LUB
db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})
Udostępnianie dla przyszłych czytelników.
To zapytanie działało dla nas (zapytanie wykonane z kompasu MongoDB ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
W idealnym przypadku chciałbyś przetestować wszystkie trzy wartości , null , „” lub puste (pole nie istnieje w rekordzie)
Możesz wykonać następujące czynności.
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
Alternatywą, o której nie wspomniano, ale która może być bardziej wydajną opcją dla niektórych (nie będzie działać z pozycjami NULL), jest użycie indeksu rzadkiego (wpisy w indeksie istnieją tylko wtedy, gdy jest coś w polu). Oto przykładowy zestaw danych:
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 }
Teraz utwórz indeks rzadki w polu imageUrl:
db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Teraz zawsze istnieje szansa (a zwłaszcza przy małym zestawie danych, takim jak moja próbka), że zamiast używać indeksu, MongoDB użyje skanowania tabeli, nawet w przypadku potencjalnie objętego zapytania indeksu. Jak się okazuje, daje mi to łatwy sposób zilustrowania różnicy tutaj:
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" }
{ }
{ }
OK, więc dodatkowe dokumenty bez imageUrl
są zwracane, tylko puste, a nie to, co chcieliśmy. Aby potwierdzić, wyjaśnij:
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
}
Tak, a więc jest BasicCursor
równy skanowi tabeli, nie używał indeksu. Zmuśmy zapytanie do użycia naszego rzadkiego indeksu z 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" }
I jest wynik, którego szukaliśmy - zwracane są tylko dokumenty z wypełnionym polem. To również używa tylko indeksu (tzn. Jest to zapytanie indeksu objętego zakresem), więc tylko indeks musi być w pamięci, aby zwrócić wyniki.
Jest to wyspecjalizowany przypadek użycia i nie można go ogólnie używać (zobacz inne odpowiedzi na temat tych opcji). W szczególności należy zauważyć, że w obecnej sytuacji nie można używać count()
w ten sposób (w moim przykładzie zwróci 6, a nie 4), więc proszę używać tylko w razie potrzeby.
Najprostszym sposobem sprawdzenia istnienia kolumny w kompasie mongo jest:
{ 'column_name': { $exists: true } }
Zapytanie będzie
db.mycollection.find({"IMAGE URL":{"$exists":"true"}})
zwróci wszystkie dokumenty posiadające „IMAGE URL” jako klucz ...........
$exists
sprawdza klucz "IMAGE URL"
i nie bierze pod uwagę jego wartość ( null
) i będzie zwrócić dokument "IMAGE URL" : null
.
{ field : {$ne : null} }
sprawdzenie kwerendy pod kątem wartości zerowej docs.mongodb.org/manual/reference/operator/query/ne