2014-05-10 14 views
5

Ich habe eine Sammlung, wo einige der Objekte einen Schlüssel foo enthalten. Ich versuche jetzt, nach allen Objekten zu suchen, die zwar diesen Schlüssel haben, aber nicht mit dem spezifischen Wert bar. Dazu benutze ich die folgende Abfrage:MongoDB/PyMongo: Abfrage mehrerer Kriterien - unerwartete Ergebnisse

Ich dachte, dass beide Kriterien über ein logisches UND verbunden sind. Ich bekomme aber auch Objekte, die keinen Schlüssel foo haben. In der Tat habe ich das gleiche Ergebnis, wenn ich die Abfrage nur

collection.find({'foo': {'$ne': 'bar'}}) 

Auf dem anderen hans, wenn ich

collection.find({'foo': {'$exists': True}}) 

ich mit foo richtig nur Objekte erhalten verwenden, aber obvisouly von allen, so einige von ihnen haben den Wert bar.

Wie muss ich meine Abfrage formulieren, um mein erstes Ergebnis zu erzielen? Gibt es eine Reihenfolge, in der mehrere Kriterien getestet werden? Spezifiziere ich explizit das logische UND beider Kriterien?

+0

Dies ist ein großartiges Beispiel für eine grundlegende pymongo Abfrage. Ich wünschte, es wäre früher entstanden, als ich "pymongo find examples" googelte: - \. +1 –

+0

Ich glaube nicht, dass es spezielle Beispiele für PyMongo gibt, da die Syntax im Wesentlichen die gleiche wie bei der Verwendung der Mongo-Shell ist. I _think_ die Mongo-Shell ist etwas großzügiger, wenn es darum geht, Zitate um Schlüsselwörter und Feldnamen herum zu haben (zB sollte '{$ ne: 'bar'}' genauso funktionieren wie '{' $ ne ':' bar '} '). Vielleicht könnte auch die Großschreibung von beispielsweise "Wahr" von Bedeutung sein. – Christian

Antwort

7

Sie können $and verwenden, um mehrere Bedingungen beitreten:

collection.find({"$and": [{"foo": {'$ne': 'bar'}}, 
          {"foo": {'$exists': True}}]}) 
+0

Perfekt, danke! Ich dachte nur, dass, wenn Sie eine Liste von Kriterien haben, 'AND' der implizit gegebene Weg ist, sie zu testen. Das meiste Beispiel, das ich fand, konzentrierte sich nur auf $ oder, daher vielleicht mein Missverständnis. Aber um beliebige komplexe Bedingungen zu unterstützen, und "$ und" ist natürlich sehr sinnvoll. – Christian

7

Keine notwendig $and zu verwenden, es funktioniert auch

db.collection.find({"foo":{"$ne":"bar", "$exists":true}}) 
+0

Cool, danke! Also ich denke, ich habe dieses Problem, da beide Kriterien auf den gleichen Schlüssel 'foo' verweisen. Gibt es einen Unterschied hinsichtlich der Leistung zwischen beiden Lösungen? – Christian

+1

Kein Unterschied von der Leistung Sicht. –

Verwandte Themen