2011-10-04 52 views
23

我一直在試圖找到一種方法來創建pyMongo客戶端的ISODate對象,但目前爲止沒有任何成功。用pyMongo創建一個ISODate

我使用http://pypi.python.org/pypi/pymongo3客戶端,這是目前在Python 3中唯一可用的嚴重客戶端,但問題似乎並不來自此特定的pymongo版本。

我想知道你們中的任何人是否已經找到解決方案來使用來自pymongo客戶端的這個MongoDB對象類型......感謝您的幫助!

+0

如果您需要轉換「now」以外的日期,則可能還需要在獲取utc值之前向您的datetime添加時區信息 – kommradHomer

回答

51

你只需要存儲一個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") 
} 
+0

似乎無效,存儲的數據爲字符串。 「timestamp」:「Wed Oct 05 2011 09:56:02 GMT + 0200(CET)」, –

+0

您使用的是哪個版本的MongoDB? –

+3

另外,ISODate不是BSON類型。這就是BSON Datetime在shell中表示的方式。在PyMongo中,它表示爲datetime.datetime的一個實例。 http://bsonspec.org/#/specification –

13

對於那些誰知道如何從時間戳創建ISODate:

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

這將創建沒有時區的datetime對象。當插入到MongoDB時,它將被轉換爲合適的ISODate()

此外,我強烈建議您查看Python TimeTransitionsImage。請注意0​​這裏是名爲元組(相當於C中的結構)。並且還要注意,即使命名相同(例如,tm_wday從星期一開始而非星期日),元組字段與C中的元組字段也不相同。

+4

'fromtimestamp()'創建一個天真的日期時間對象,它代表服務器本地時區中的時間:在大多數情況下,這不是您想要的。您應該使用'datetime.utcfromtimestamp(ts)'代替。 – jfs

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

這裏utc代表世界時間座標。

+1

歡迎來到Stack Overflow。你可以通過添加一些關於代碼的解釋來做出更好的答案 –