2016-07-13 13 views
2

Sagen wir, ich habe folgende Dokumente in myCollection:

/* 1 */ 
{ 
    "_id" : ObjectId("57861717ae5cdd68414b22fc"), 
    "category" : " ", 
    "name" : "Category is a space" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("57861728ae5cdd68414b22fd"), 
    "category" : null, 
    "name" : "Category is null" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("5786173dae5cdd68414b22fe"), 
    "name" : "Category is a not present" 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("57861755ae5cdd68414b22ff"), 
    "category" : "value", 
    "name" : "Category has value" 
} 

Ich möchte das Dokument abzufragen, die Kategoriefeld hat und der Wert nicht null ist oder nicht leer.

habe ich versucht, die folgenden Anfragen:

  1. Mit $exists und zwei $ne

    db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}, "category":{"$ne":" "}}) 
    

ich für diese drei Dokumente einsehen.

/* 1 */ 
{ 
    "_id" : ObjectId("57861728ae5cdd68414b22fd"), 
    "category" : null, 
    "name" : "Category is null" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5786173dae5cdd68414b22fe"), 
    "name" : "Category is a not present" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("57861755ae5cdd68414b22ff"), 
    "category" : "value", 
    "name" : "Category has value" 
} 
  1. Mit $exists und $ne=null

    db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}}) 
    

Ich habe 2 Dokumente für diese.

/* 1 */ 
{ 
    "_id" : ObjectId("57861717ae5cdd68414b22fc"), 
    "category" : " ", 
    "name" : "Category is a space" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("57861755ae5cdd68414b22ff"), 
    "category" : "value", 
    "name" : "Category has value" 
} 
  1. Schließlich habe ich versucht, mit $exists und zwei $ne eingeschlossen in $and

    db.myCollection.find({"category":{"$exists":true}, "$and":[{"category":{"$ne":null}}, {"category":{"$ne":" "}}]}) 
    

Nur gab dies die gewünschte Ausgabe:

/* 1 */ 
{ 
    "_id" : ObjectId("57861755ae5cdd68414b22ff"), 
    "category" : "value", 
    "name" : "Category has value" 
} 

Jetzt, wo ich mein gewünschtes Ergebnis habe, ich wan t zu verstehen, was falsch ist mit den anderen beiden Abfragen, insbesondere der ersten.

Antwort

2

Vom docs

MongoDB bietet eine implizite UND-Verknüpfung, wenn ein Komma getrennte Liste von Ausdrücken angeben. Die Verwendung eines expliziten AND mit dem $ und Operator ist erforderlich, wenn das gleiche Feld oder Operator in mehreren Ausdrücken angegeben werden muss.

Ihre erste Abfrage verwendet das gleiche Feld mehrmals und die zweite Abfrage filtert einfach den leeren Wert nicht aus.

+0

Das macht Sinn. Also, wenn wir es jetzt betrachten, wenn das gleiche Feld mehrfach verwendet wird, wird nur der letzte Eintrag in Betracht gezogen, genau wie in einer HashMap. Gutes Lernen heute. Danke für die Klärung. – Nattyk

Verwandte Themen