2012-09-08 17 views
5

estoy añadiendo un valor de fecha en una colección MongoDB como parte de un mapa a reducir la llamada:colocación de un objeto Fecha en MongoDB, volviendo un flotador al consultar con pymongo

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

Cuando más tarde consultar esta colección en el shell de Mongo Veo:

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

De alguna manera la fecha parece un número entero - Supongo que es una representación de marca de tiempo. Si hago esto:

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

que vuelva la fecha correcta:

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

Mi pregunta es cómo hacer lo mismo en pymongo. Si me quedo cualquier consulta en la colección anterior, pymongo devuelve los documentos en los que el valor day como un tipo flotador con el mismo valor que la marca de tiempo:

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

¿Cómo se activa esta marca de tiempo en un pitón datetime?

Respuesta

6

Parece milisegundos desde la época (1 Enero 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) 
>>> 

ACTUALIZACIÓN: cheque división Agregado de primer comentario.

+2

+1, pero debe cambiar '1000' por' 1000.0' o agregar 'desde __future__ división de importación' para evitar la división de enteros, que mata la precisión en milisegundos de la marca de tiempo. – Cameron

+0

Esto funciona. ¿Alguna idea de por qué la información del tipo se pierde en el camino? –

+0

Oh, espera, el valor de pymongo es flotante, por lo que mi comentario anterior no se aplica. Aún así, es mejor ser explícito que confiar en el conocimiento de eso, supongo. – Cameron

0

El título de la pregunta no es el mismo que el código.

Date.UTC() devuelve un entero, no un objeto de fecha. Está almacenando el número entero y mongoDB está de acuerdo con eso. Más tarde, saca el número entero y lo usa en el constructo Date() y en el entorno javascript todo está bien. Pero en python, solo ve el entero. La conversión publicada anteriormente parece ser buena.

Cuestiones relacionadas