2012-09-08 2 views
5

ich einen Datumswert in eine MongoDB Sammlung als Teil eines Karten reduziert Gespräch hinzugefügt:Putting ein Date-Objekt in MongoDB, einen Schwimmer immer wieder, wenn sie mit pymongo Abfrage

day = Date.UTC(this.time.getFullYear(), this.time.getMonth(), this.time.getDate()); 
emit({ user : this.user, day : day }, { count : 1 }); 

Als ich dies später abfragen Sammlung in der Mongo Shell sehe ich:

{ "_id" : { "user" : "assaf", "day" : 1331769600000 }, "value" : { "count" : 15 } } 
{ "_id" : { "user" : "assaf", "day" : 1331856000000 }, "value" : { "count" : 57 } } 

Irgendwie sieht das Datum aus wie eine ganze Zahl - ich denke, es ist eine Zeitstempel Darstellung. Wenn ich dies tun:

PRIMARY> new Date(db.my_collection.find()[0]["_id"]["day"]) 

ich das richtige Datum zurück:

ISODate("2012-03-19T00:00:00Z") 

Meine Frage ist, wie man das gleiche in pymongo zu tun. Wenn ich jede Abfrage auf der obigen Sammlung ausführen, pymongo Dokumente, in denen kehrt der day Wert als Schwimmer-Typ mit dem gleichen Wert wie der Zeitstempel:

dict: {u'_id': {u'user': u'ariel', u'day': 1332115200000.0}, u'value': {u'count': 99.0}} 

Wie kann ich diesen Zeitstempel in eine Python drehen datetime?

Antwort

6

Sieht aus wie Millisekunden seit Epoche (1. Januar 1970):

>>> from __future__ import division 
>>> dict = {u'_id': {u'user': u'ariel', u'day': 1332115200000.0}, u'value': {u'count': 99.0}} 
>>> datetime.datetime.utcfromtimestamp(dict['_id']['day']/1000.0) 
datetime.datetime(2012, 3, 19, 0, 0) 
>>> 

UPDATE: Added Division Scheck von ersten Kommentar.

+2

+1, aber Sie sollten '1000' in' 1000.0' ändern oder '' from__future__ import division' hinzufügen, um eine ganzzahlige Division zu vermeiden, wodurch die Millisekunden-Genauigkeit des Zeitstempels verloren geht. – Cameron

+0

Das funktioniert. Irgendeine Idee warum die Typinformation auf dem Weg verloren geht? –

+0

Oh, Moment mal, der Wert von Pymongo ist ein Float - also trifft mein vorheriger Kommentar nicht zu. Dennoch, besser, um explizit zu sein, als sich darauf zu verlassen, nehme ich an. – Cameron

0

Der Titel der Frage ist nicht derselbe wie der Code.

Date.UTC() gibt eine Ganzzahl und kein Datumsobjekt zurück. Sie speichern die ganze Zahl und mongoDB ist damit einverstanden. Später ziehen Sie die ganze Zahl heraus und verwenden sie im Konstrukt Date(). In der Javascript-Umgebung ist das alles in Ordnung. Aber in Python sieht es nur die ganze Zahl. Die früher veröffentlichte Konvertierung scheint eine gute zu sein.

Verwandte Themen