2016-04-04 9 views
-1

ich eine mongodb Sammlung mit einem der Felder wie haben:Pymongo Datum Abfrage in „TT/MM/JJJJ“ Format

u'Date': u'15/03/2016' 

nun aus meinem Verständnis u bedeutet, dass Strings einfach Unicode sind, die in Ordnung ist . Ich verwende Django und pymongo Benutzer zu ermöglichen, 2 Termine auswählen und meine DB für Sachen zwischen diesen beiden Daten wie die Abfrage:

number = coll.find({"Date": {'$gt': startDate}, "Date": {'$lt': endDate}}).count() 

Wo ist mein startdate und endDate sind sowohl in den Formaten „DD/MM/YYYY“ . Was ich jedoch zurückbekomme, sind einige Mülldaten. Wie kann man Daten in Python-Mongo korrekt abfragen?

P. S aus meinem Verständnis Komma zwischen diesen beiden Ergebnissen in "UND" Abfrage richtig?

+0

verwenden, um Daten keine Strings – OTTA

+0

Was meinen Sie Daten? Ich kann nichts in db ändern, Daten werden von einem externen Client zur Verfügung gestellt. –

Antwort

1

Wenn die Daten als Zeichenfolgen in der Datenbank gespeichert werden, ist die Operation bei Verwendung des Operators $gt oder $lt ein Zeichenfolgenvergleich, kein Datumsvergleich. Was bedeutet das zum Beispiel: "15/03/2016 < 16/02/2016", weil 5 in lexikalischer Reihenfolge vor 6 kommt. Damit der Zeichenfolgenvergleich funktioniert, müssen die Daten in einem Format gespeichert werden, in dem ein "kleineres" Datum immer als eine "kleinere" Zeichenfolge dargestellt wird. Zum Beispiel mit YYYY/MM/DD.

Wenn Sie also den Vergleich nicht in Python machen möchten, könnten Sie entweder das Datumsformat ändern oder das Datum als Datum in der DB speichern. Aber in beiden Fällen bedeutet dies die DB zu ändern ...

Wenn in Python zu tun in Ordnung ist, dann können Sie es wie folgt:

from datetime import datetime 

date_format = "%d/%m/%Y" 
start_date = datetime.strptime(startDate, date_format) 
end_date = datetime.strptime(endDate, date_format) 
items = coll.find({}) 

def compare(c, item): 
    item_date = datetime.strptime(item['Date'], date_format) 
    if start_date < item_date < end_date: 
     return c+1 
    else: 
     return c 

count = reduce(compare, items, 0) 
+0

Danke für Ihre Antwort! Leider kann ich die Datenbank nicht ändern, ich kann mir keine einfache Möglichkeit vorstellen, sie auch in Python abzufragen ..;/ –

+0

@ PawełLaskowski, eigentlich dachte ich nur, du könntest eine bessere Lösung haben: du kannst die [map_reduce engine] verwenden (https: //docs.mongodb.org/manual/core/map-reduce/), um den Vergleich in einer Javascript-Funktion durchzuführen, die von der DB ausgeführt wird. Aber er geht über mein derzeitiges Wissen über Mongodb hinaus. – Djizeus

+0

@ PawełLaskowski, bemerkte nicht, dass Sie auch Schwierigkeiten hatten, es in Python zu tun, redigierte meine Antwort mit einem Vorschlag :) – Djizeus