Nie wierzę, że to się zmieniło. Podczas sprawdzania $ ne wartość jest sprawdzana we wszystkich dokumentach, łącznie z tymi, które nie zawierają pola, ale $ ne: null nadal nie będzie pasować do dokumentu, który nie zawiera pola, ponieważ wartość pola jest wciąż pusta, nawet jeśli pole nie istnieje w tym dokumencie.
Tim Gautier
2
Jak dopasujesz drugi dokument?
BT
1
@ Rzeka Sprawdziłem, kiedy napisałem to 3 lata temu i, aby się upewnić, właśnie zainstalowałem Mongo i wypróbowałem go ponownie. Nadal działa w ten sam sposób, odpowiedź jest prawidłowa. Przedostatnie zapytanie zwraca tylko pierwszy dokument.
Tim Gautier,
1
Podane przykłady sprawiają, że naprawdę zrozumiałe jest, jak z tego korzystać. :-)
$ 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:
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
Czy to ważny dokument Jsona? Dwie właściwości o tej samej nazwie w dokumencie zapytania. Nie jestem pewien, jak zbudowałbyś to w pamięci, gdybyś musiał.
BrentR
4
W idealnym przypadku chciałbyś przetestować wszystkie trzy wartości , null , „” lub puste (pole nie istnieje w rekordzie)
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:
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:
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.
Problem polega na tym, że zakłada, że pole rzeczywiście nigdy nie zostało utrzymane, ale wydaje się, że PO wskazuje (z nagłówka), że może istnieć, ale należy wyraźnie ustawić na zero.
@dorvak dokładnie, dlatego nie spełnia przypadku użycia w pytaniu.
kilianc
Ta odpowiedź jest błędna, ponieważ $existssprawdza 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/neOdpowiedzi:
Spowoduje to zwrócenie wszystkich dokumentów z kluczem o nazwie „IMAGE URL”, ale nadal mogą mieć wartość zerową.
Spowoduje to zwrócenie wszystkich dokumentów z kluczem o nazwie „IMAGE URL” i wartością inną niż 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:
Spowoduje to zwrócenie wszystkich trzech dokumentów:
Zwróci tylko pierwszy i drugi dokument:
Zwróci tylko pierwszy dokument:
Zwróci tylko drugi i trzeci dokument:
źródło
$ne
obejmuje dokumenty, które nie zawierają pola . Czy zmieniło się to od czasu opublikowania odpowiedzi? docs.mongodb.org/manual/reference/operator/query/neJedna wkładka jest najlepsza:
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:
źródło
$exists: true
jest zbędny,$ne: null
wystarczy.$exists: true
zwracanull
również wartości. Musi być jedno$exists: true
i drugie$ne: null
. To NIE jest zbędne.W pymongo możesz użyć:
Ponieważ pymongo reprezentuje mongo „null” jako python „None”.
źródło
pobierz dokumenty zawierające tę nazwę pliku, nawet jeśli jest ona pusta.
Moja propozycja:
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
Dodatkowa walidacja:
Okej, więc jeszcze nie skończyliśmy, potrzebujemy dodatkowego warunku.
LUB
Odniesienie
źródło
To zapytanie działało dla nas (zapytanie wykonane z kompasu MongoDB ):
źródło
źródło
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.
źródło
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:
Teraz utwórz indeks rzadki w polu imageUrl:
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:
OK, więc dodatkowe dokumenty bez
imageUrl
są zwracane, tylko puste, a nie to, co chcieliśmy. Aby potwierdzić, wyjaśnij:Tak, a więc jest
BasicCursor
równy skanowi tabeli, nie używał indeksu. Zmuśmy zapytanie do użycia naszego rzadkiego indeksu zhint()
: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.źródło
Najprostszym sposobem sprawdzenia istnienia kolumny w kompasie mongo jest:
źródło
Zapytanie będzie
zwróci wszystkie dokumenty posiadające „IMAGE URL” jako klucz ...........
źródło
$exists
sprawdza klucz"IMAGE URL"
i nie bierze pod uwagę jego wartość (null
) i będzie zwrócić dokument"IMAGE URL" : null
.