Создайте ISODate с помощью pyMongo

Я пытался найти способ создать объект ISODate с клиентом pyMongo, но пока безуспешно.

Я использую клиент http://pypi.python.org/pypi/pymongo3, единственный серьезный клиент, доступный на Python. 3 на данный момент, но проблема, похоже, не связана с этой конкретной версией pymongo.

Я хотел бы знать, нашел ли кто-нибудь из вас решение для использования этого типа объекта MongoDB из клиента pymongo... спасибо за вашу помощь!


person Guillaume Lebourgeois    schedule 04.10.2011    source источник
comment
если вам нужно преобразовать дату, отличную от текущей, вы также можете добавить информацию о часовом поясе в дату и время, прежде чем получать значение utc   -  person kommradHomer    schedule 27.02.2015


Ответы (4)


Вам просто нужно сохранить экземпляр datetime.datetime.

Вставка из оболочки python:

>>> c.test.test.insert({'date': datetime.datetime.utcnow()})
ObjectId('4e8b388367d5bd2de0000000')
>>> c.test.test.find_one()
{u'date': datetime.datetime(2011, 10, 4, 16, 46, 59, 786000), u'_id': ObjectId('4e8b388367d5bd2de0000000')}

Запрос в оболочке монго:

> db.test.findOne()
{
    "_id" : ObjectId("4e8b388367d5bd2de0000000"),
    "date" : ISODate("2011-10-04T16:46:59.786Z")
}
person Bernie Hackett    schedule 04.10.2011
comment
Кажется, не работает, сохраненные данные представляют собой строку. отметка времени: 05 октября 2011 г., 09:56:02 GMT+0200 (CET), - person Guillaume Lebourgeois; 05.10.2011
comment
Какую версию MongoDB вы используете? - person Bernie Hackett; 05.10.2011
comment
Кроме того, ISODate не является типом BSON. Именно так BSON Datetime представлен в оболочке. В PyMongo он представлен как экземпляр datetime.datetime. bsonspec.org/#/specification - person Bernie Hackett; 05.10.2011
comment
Моя MongoDB была ‹ 1.7, после обновления она отлично работает, когда я отправляю экземпляры datetime.datetime. - person Guillaume Lebourgeois; 06.10.2011
comment
так просто. искал это везде. Большое спасибо. - person avi; 01.02.2014

Для тех, кому интересно, как создать ISODate из метки времени:

ts = time.time()
isodate = datetime.datetime.fromtimestamp(ts, None)

Это создаст объект datetime без часового пояса. При вставке в MongoDB он будет преобразован в правильный ISODate().

Кроме того, я настоятельно рекомендую просмотреть Python TimeTransitionsImage. Обратите внимание, что tuple здесь является именованным кортежем (эквивалентно структуре в C). Также обратите внимание, что поля кортежа не такие, как в аналогах C, даже несмотря на то, что имена те же (например, tm_wday начинается с понедельника, а не с воскресенья).

person johndodo    schedule 06.03.2012
comment
fromtimestamp() создайте наивный объект datetime, который представляет время в локальном часовом поясе вашего сервера: в большинстве случаев это не то, что вам нужно. Вместо этого вы должны использовать datetime.utcfromtimestamp(ts). - person jfs; 17.08.2015

На самом деле это тоже не работает. Когда вы пытаетесь использовать либо utcfromtimestamp, либо fromtimestamp, программа сообщает, что ей нужно число с плавающей запятой. Просто разберите строку в объект даты и времени и используйте его непосредственно в файле Mongodb. фильтр

from_dt = datetime.strptime('2018-04-01','%Y-%m-%d')
#from_dts = datetime.utcfromtimestamp(from_dt)
to_dt = datetime.strptime('2018-04-30','%Y-%m-%d')
#to_dts = datetime.utcfromtimestamp(to_dt)
filterCondition = { 
    "LastLogin" : { "$lte" : to_dt},
    "LastLogin" : { "$gte" : from_dt}
}

А потом

db[(colName)].find({ "<colName>" : filterCondition }) 

Должно сработать...

person Sandip Sinha    schedule 26.06.2018

result = db.objects.insert_one(
   {"last_modified": datetime.datetime.utcnow()})

Здесь utc обозначает универсальные временные координаты.

person Community    schedule 26.07.2016
comment
Добро пожаловать в Stack Overflow. Вы могли бы сделать это лучшим ответом, добавив некоторое объяснение того, что делает код. - person Mark Chorley; 26.07.2016