2012-09-08 13 views
5

Dodaję wartość daty w kolekcji MongoDB jako część mapy-zredukować połączenia:Umieszczenie obiektu Date do MongoDB, wracając pływaka podczas odpytywania z pymongo

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

Kiedy później tego zapytania kolekcja w powłoce Mongo Widzę:

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

Jakoś data wygląda jak liczba całkowita - myślę, że jest to jakaś reprezentacja sygnatury czasowej. Gdybym to zrobić:

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

wrócę poprawną datę:

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

Moje pytanie brzmi, jak zrobić to samo w pymongo. Jeśli mogę uruchomić żadnej kwerendy w powyższej kolekcji, pymongo zwraca dokumenty, w którym wartość day jako typu float o tej samej wartości, co datownika:

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

Jak włączyć ten znacznik czasu w Pythonie datetime?

Odpowiedz

6

Wygląda milisekund od epoki (1 sty 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: Dodano podział check od pierwszego komentarza.

+2

+1, ale powinieneś zmienić '1000' na' 1000.0' lub dodać 'from __future__ import division', aby uniknąć dzielenia liczby całkowitej, co zabija milisekundową dokładność znacznika czasu. – Cameron

+0

To działa. Każdy pomysł, dlaczego informacje o typie są tracone po drodze? –

+0

Och, czekaj, wartość z pymongo jest zmiennoprzecinkową - więc mój poprzedni komentarz nie ma zastosowania. Mimo to, lepiej jest być wyraźnym niż polegać na wiedzy o tym, jak sądzę. – Cameron

0

Tytuł pytania nie jest taki sam jak kod.

Funkcja Date.UTC() zwraca liczbę całkowitą, a nie obiekt daty. Przechowujesz liczbę całkowitą, a mongoDB jest w porządku z tym. Później wyciągniesz integer i użyjesz go w konstrukcie Date() oraz w javascriptowym środowisku, wszystko w porządku. Ale w Pythonie widzi tylko liczbę całkowitą. Opublikowana wcześniej konwersja wydaje się być dobrą.