2016-11-23 7 views
0

mit Gibt es einen Unterschied in der Ausführungszeit zwischen den zwei Abfragen in pymongo:Abfrage Einfeldmehrfach Ausführungsgeschwindigkeit in mongodb pymongo

db.collection.find({'date': {'$gte': datetime(2000, 01, 01), '$lt': datetime(2016, 11, 23)}}) 

db.collection.find({'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}}) 

Im zweiten Fall, dass ich das gleiche Feld zweimal am abfragt. Ich habe Mongo-Shell und lief .explain("executionStats") und der einzige Unterschied war in den Abfragen ("queryPlanner.parsedQuery"), in dem für die erste war:

"$and" : [ 
    { 
     "date" : { 
      "$lt" : ISODate("2016-11-23T00:00:00Z") 
     } 
    }, 
    { 
     "date" : { 
      "$gte" : ISODate("2000-01-01T00:00:00Z") 
     } 
    } 
] 

und dies für die zweite:

"date" : { 
    "$lt" : ISODate("2016-11-23T00:00:00Z") 
} 

Ich bin Abfrage einer Sammlung mit Zehntausenden von Dokumenten und es wird mehrfach abgefragt. Also muss ich die Abfrage optimieren.

+0

Wird das Feld "Datum" indiziert? Wenn nicht, sollte dies der erste Schritt zur Verbesserung der Geschwindigkeit der Operation sein. Wenn dies der Fall ist, gibt es Unterschiede zwischen den beiden EXPLAIN-Plänen zwischen der Verwendung von Indexgrenzen? Möglicherweise müssen Sie .explain erneut ausführen, indem Sie die Option 'true' übergeben, z. ".explain (true)" –

+0

Hey, ich frage mehrere Felder (ca. 6) auf die Sammlung und Indexierung des Datums wird nicht viel helfen. Das Feld "Datum" hat jedoch einen Bereich, und alle anderen Felder stimmen nur mit der Wertgleichheit überein. Also, ich denke @hayades 'Antwort erklärt, dass meine Abfrage tatsächlich falsch ist und beide Abfragen nicht äquivalent sind, da wir nicht denselben Schlüssel für zwei verschiedene Werte in einem Mapping-Typ haben können (in diesem Fall ein Python-Dictionary). –

Antwort

0

Wenn Sie genau auf Ihre zweite Abfrage zu finden -

{'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}} 

Sie sollten beachten, dass dies ein Objekt (dict in Python) mit Tasten date und date, was natürlich keinen Sinn macht. Sie versuchen, ein Objekt mit denselben Schlüsseln zu erstellen. Somit wird nur einer von ihnen gültig sein (der zweite in diesem Fall). Daher ist die Abfrage zu Mongo {date': {'$lt': datetime(2016, 11, 23)}}, die Ihnen die gewünschte Ausgabe nicht geben wird.

Ich würde vorschlagen, dass Sie die Abfrage in Bezug auf logische Operatoren so klar wie möglich definieren sollten. Dies wäre in diesem Fall der Ausgang der explain Stufe. Daher sollte die Verwendung von $and zum Ausdrücken zweier verschiedener Bedingungen die beste Möglichkeit zum Abfragen sein.

{"$and" : [ 
    {"date" : {"$lt" : ISODate("2016-11-23T00:00:00Z")}}, 
    {"date" : {"$gte" : ISODate("2000-01-01T00:00:00Z")}} 
]} 

Kommen zu dem Thema, wie die Abfrage schneller zu machen, sollten Sie einen Index für date werden. Die Definition dieses Indexes als einzelner Index {date: 1} würde helfen, sich auf die relevanten Dokumente zu beschränken.

Verwandte Themen