Ich glaube nicht, dass sich das geändert hat. Bei der Überprüfung von $ ne wird der Wert in allen Dokumenten überprüft, einschließlich derjenigen, die das Feld nicht enthalten. $ Ne: null stimmt jedoch immer noch nicht mit einem Dokument überein, das das Feld nicht enthält, da der Wert des Felds immer noch null ist. obwohl das Feld in diesem Dokument nicht vorhanden ist.
Tim Gautier
2
Wie passt man gerade zum zweiten Dokument?
BT
1
@ River Ich habe es überprüft, als ich es vor 3 Jahren geschrieben habe, und um sicher zu gehen, habe ich gerade Mongo installiert und es erneut ausprobiert. Es funktioniert immer noch genauso, die Antwort ist richtig. Die vorletzte Abfrage gibt nur das erste Dokument zurück.
Tim Gautier
1
Die Beispiele machen es wirklich verständlich, wie man das benutzt. :-)
mycollection : Geben Sie Ihren gewünschten Sammlungsnamen ein
Feldname : Geben Sie Ihren gewünschten Feldnamen ein
Erklärung:
$ existiert : Wenn true, stimmt $ exist mit den Dokumenten überein, die das Feld enthalten, einschließlich Dokumenten, bei denen der Feldwert null ist. Wenn false, gibt die Abfrage nur die Dokumente zurück, die das Feld nicht enthalten.
$ ne wählt die Dokumente aus, bei denen der Wert des Feldes nicht dem angegebenen Wert entspricht. Dies schließt Dokumente ein, die das Feld nicht enthalten.
In Ihrem angegebenen Fall ist die folgende Abfrage vorhanden, bei der alle Dokumente mit dem Bild imageurl zurückgegeben werden und die keinen Nullwert haben:
Sie können den Typ des erforderlichen Attributs überprüfen. Es werden alle Dokumente zurückgegeben, deren abgefragter Feldname einen Wert enthält, da Sie den Typ des Dateis überprüfen. Andernfalls stimmt die Typbedingung nicht überein, sodass nichts zurückgegeben wird.
Nb : Wenn der Feldname eine leere Zeichenfolge hat, die "" bedeutet, wird sie zurückgegeben. Dies ist das gleiche Verhalten für
Ist dies ein gültiges Json-Dokument? Zwei gleichnamige Eigenschaften im Abfragedokument. Ich bin mir nicht sicher, wie Sie das im Speicher aufbauen würden, wenn Sie müssten.
BrentR
4
Im Idealfall möchten Sie alle drei Werte testen , null , "" oder leer (Feld im Datensatz nicht vorhanden)
Eine Alternative, die nicht erwähnt wurde, aber für einige eine effizientere Option sein kann (funktioniert nicht mit NULL-Einträgen), ist die Verwendung eines spärlichen Index (Einträge im Index sind nur vorhanden, wenn sich etwas im Feld befindet). Hier ist ein Beispieldatensatz:
Jetzt besteht immer die Möglichkeit (und insbesondere bei einem kleinen Datensatz wie meinem Beispiel), dass MongoDB anstelle eines Index einen Tabellenscan verwendet, selbst für eine potenziell abgedeckte Indexabfrage. Wie sich herausstellt, kann ich den Unterschied hier auf einfache Weise veranschaulichen:
OK, die zusätzlichen Dokumente ohne Nein imageUrlwerden zurückgegeben, nur leer, nicht das, was wir wollten. Um zu bestätigen, warum, erklären Sie Folgendes:
Also, ja, a BasicCursorentspricht einem Tabellenscan, es wurde der Index nicht verwendet. Lassen Sie uns die Abfrage zwingen, unseren Sparse-Index mit einem zu verwenden hint():
Und da ist das Ergebnis, nach dem wir gesucht haben - nur Dokumente mit dem ausgefüllten Feld werden zurückgegeben. Dies verwendet auch nur den Index (dh es handelt sich um eine abgedeckte Indexabfrage), sodass sich nur der Index im Speicher befinden muss, um die Ergebnisse zurückzugeben.
Dies ist ein spezieller Anwendungsfall und kann nicht allgemein verwendet werden (siehe andere Antworten für diese Optionen). Insbesondere sollte beachtet werden, dass Sie dies aus heutiger Sicht nicht count()auf diese Weise verwenden können (in meinem Beispiel wird 6 statt 4 zurückgegeben). Verwenden Sie es daher bitte nur, wenn dies angemessen ist.
Das Problem dabei ist, dass davon ausgegangen wird, dass das Feld wirklich nie beibehalten wurde, aber das OP scheint (aus der Überschrift) anzuzeigen, dass es existieren könnte, aber explizit auf Null gesetzt werden kann.
@dorvak genau, deshalb wird das den Anwendungsfall in der Frage nicht befriedigen.
Kilianc
Diese Antwort ist falsch, da $existsnach dem Schlüssel gesucht wird "IMAGE URL"und sein Wert ( null) nicht berücksichtigt wird und ein Dokument mit zurückgegeben wird "IMAGE URL" : null.
{ field : {$ne : null} }
für nicht null docs.mongodb.org/manual/reference/operator/query/neAntworten:
Dadurch werden alle Dokumente mit einem Schlüssel namens "IMAGE URL" zurückgegeben, sie können jedoch weiterhin einen Nullwert haben.
Dadurch werden alle Dokumente mit einem Schlüssel namens "IMAGE URL" und einem Wert ungleich Null zurückgegeben.
Laut den Dokumenten kann $ derzeit keinen Index verwenden, $ ne jedoch.
Bearbeiten: Hinzufügen einiger Beispiele aufgrund des Interesses an dieser Antwort
Angesichts dieser Beilagen:
Dadurch werden alle drei Dokumente zurückgegeben:
Dadurch werden nur das erste und das zweite Dokument zurückgegeben:
Dies gibt nur das erste Dokument zurück:
Dies gibt nur das zweite und dritte Dokument zurück:
quelle
$ne
Enthält laut Dokumenten Dokumente, die das Feld nicht enthalten . Hat sich dies geändert, seit Sie die Antwort gepostet haben? docs.mongodb.org/manual/reference/operator/query/neEin Liner ist der beste:
Hier,
mycollection : Geben Sie Ihren gewünschten Sammlungsnamen ein
Feldname : Geben Sie Ihren gewünschten Feldnamen ein
Erklärung:
$ existiert : Wenn true, stimmt $ exist mit den Dokumenten überein, die das Feld enthalten, einschließlich Dokumenten, bei denen der Feldwert null ist. Wenn false, gibt die Abfrage nur die Dokumente zurück, die das Feld nicht enthalten.
$ ne wählt die Dokumente aus, bei denen der Wert des Feldes nicht dem angegebenen Wert entspricht. Dies schließt Dokumente ein, die das Feld nicht enthalten.
In Ihrem angegebenen Fall ist die folgende Abfrage vorhanden, bei der alle Dokumente mit dem Bild imageurl zurückgegeben werden und die keinen Nullwert haben:
quelle
$exists: true
ist redundant,$ne: null
ist genug.$exists: true
gibt auchnull
Werte zurück. Es muss beides geben$exists: true
und$ne: null
. Es ist NICHT redundant.In Pymongo können Sie verwenden:
Weil Pymongo Mongo "null" als Python "None" darstellt.
quelle
Rufen Sie Dokumente ab, die diesen Dateinamen enthalten, auch wenn er null ist.
Mein Vorschlag:
Sie können den Typ des erforderlichen Attributs überprüfen. Es werden alle Dokumente zurückgegeben, deren abgefragter Feldname einen Wert enthält, da Sie den Typ des Dateis überprüfen. Andernfalls stimmt die Typbedingung nicht überein, sodass nichts zurückgegeben wird.
Nb : Wenn der Feldname eine leere Zeichenfolge hat, die "" bedeutet, wird sie zurückgegeben. Dies ist das gleiche Verhalten für
Zusätzliche Validierung:
Okay, wir sind noch nicht fertig, wir brauchen eine zusätzliche Bedingung.
ODER
Referenz
quelle
Diese Abfrage hat bei uns funktioniert (Abfrage vom MongoDB-Kompass ausgeführt ):
quelle
quelle
Im Idealfall möchten Sie alle drei Werte testen , null , "" oder leer (Feld im Datensatz nicht vorhanden)
Sie können Folgendes tun.
quelle
Eine Alternative, die nicht erwähnt wurde, aber für einige eine effizientere Option sein kann (funktioniert nicht mit NULL-Einträgen), ist die Verwendung eines spärlichen Index (Einträge im Index sind nur vorhanden, wenn sich etwas im Feld befindet). Hier ist ein Beispieldatensatz:
Erstellen Sie nun den Sparse-Index für das Feld imageUrl:
Jetzt besteht immer die Möglichkeit (und insbesondere bei einem kleinen Datensatz wie meinem Beispiel), dass MongoDB anstelle eines Index einen Tabellenscan verwendet, selbst für eine potenziell abgedeckte Indexabfrage. Wie sich herausstellt, kann ich den Unterschied hier auf einfache Weise veranschaulichen:
OK, die zusätzlichen Dokumente ohne Nein
imageUrl
werden zurückgegeben, nur leer, nicht das, was wir wollten. Um zu bestätigen, warum, erklären Sie Folgendes:Also, ja, a
BasicCursor
entspricht einem Tabellenscan, es wurde der Index nicht verwendet. Lassen Sie uns die Abfrage zwingen, unseren Sparse-Index mit einem zu verwendenhint()
:Und da ist das Ergebnis, nach dem wir gesucht haben - nur Dokumente mit dem ausgefüllten Feld werden zurückgegeben. Dies verwendet auch nur den Index (dh es handelt sich um eine abgedeckte Indexabfrage), sodass sich nur der Index im Speicher befinden muss, um die Ergebnisse zurückzugeben.
Dies ist ein spezieller Anwendungsfall und kann nicht allgemein verwendet werden (siehe andere Antworten für diese Optionen). Insbesondere sollte beachtet werden, dass Sie dies aus heutiger Sicht nicht
count()
auf diese Weise verwenden können (in meinem Beispiel wird 6 statt 4 zurückgegeben). Verwenden Sie es daher bitte nur, wenn dies angemessen ist.quelle
Der einfachste Weg, um die Existenz der Säule im Mongo-Kompass zu überprüfen, ist:
quelle
Die Abfrage wird sein
Es werden alle Dokumente zurückgegeben, deren Schlüssel "IMAGE URL" ist.
quelle
$exists
nach dem Schlüssel gesucht wird"IMAGE URL"
und sein Wert (null
) nicht berücksichtigt wird und ein Dokument mit zurückgegeben wird"IMAGE URL" : null
.