2012-06-14 59 views
0

昨天我對MongoDB有一些奇怪的體驗。我正在使用twisted和txmongo - mongodb的異步驅動程序(類似於pymongo)。MongoDB日期和刪除對象

我有一個休息服務,它接收一些數據並把它放到mongodb。一個字段是以毫秒爲單位的13個數字的時間戳。

首先,將python中的毫秒時間戳轉換爲python datetime並不是一件簡單的方法。我結束了這樣的事情:

def date2ts(ts): 
    return int((time.mktime(ts.timetuple()) * 1000) + (ts.microsecond/1000)) 


def ts2date(ts): 
    return datetime.datetime.fromtimestamp(ts/1000) + datetime.timedelta(microseconds=(ts % 1000)) 

的問題是,當我將數據保存到MongoDB中,retreive日期時間回來,將其轉換回時間戳使用我的功能我沒有得到以毫秒爲單位的相同的結果。

我不明白爲什麼會發生這種情況。日期時間作爲ISODate對象保存在mongodb中。我試圖從shell中查詢它,並且在一秒或幾毫秒內確實存在差異。

問題1:有人知道爲什麼會發生這種情況嗎?

但是這還沒有結束。我決定不使用日期時間並直接保存時間戳。在此之前,我從集合中刪除了所有數據。我很驚訝,當我試圖保存相同的字段不是日期,但只要它,它被表示爲shell中的ISODate。當檢索時,在幾毫秒內仍然存在差異。

我試圖刪除收集和索引。當它沒有幫助我試圖刪除整個數據庫。當它沒有幫助我試圖刪除整個數據庫並重新啓動mongod。在此之後,我想它開始將它保存爲Long。

問題2:有人知道爲什麼會發生這種情況嗎?

謝謝!自1月1日,1970年在JavaScript(進而MongoDB的),該時間戳的Unix時間戳

回答

0

Python的時間戳在計算,在另一方面,是在毫秒條款。也就是說,如果你手頭只有時間戳,那麼你可以將Python值乘以1000來獲得毫秒並將該值存儲到MongoDB中。同樣,您可以從MongoDB獲取該值並將其除以1000以使其成爲Python時間戳。請記住,Python似乎只關注小數點後的兩位有效數字,而不是三位數(因爲它通常不會關心毫秒),所以請記住,如果您仍然存在10毫秒的差異。

通常我會建議使用元組來處理,但是對於每種語言,值範圍的約定是不同的(JavaScript是不直觀的,因爲它從0開始而不是1開始),並且可能導致問題在路上。

+0

我需要以毫秒爲單位進行存儲,以便通過時間戳字段進行精確查詢。我認爲最簡單的方法是將時間戳存儲很長時間。 –

+0

「Python的時間戳記是以秒計算的」datetime有一個微秒字段,實際上可以存儲毫秒時間戳記。我想txmongo驅動程序做錯了方式。 –

+0

找到這個評論它[pymongo驅動程序來源](https://github.com/mongodb/mongo-python-driver/blob/master/bson/son.py#L65):datetime.datetime實例將四捨五入到最近毫秒時保存 –

0

它可能是不同時區的情況。請使用下面提到的功能來糾正它。

function time_format(d, offset) { 
    // Set timezone 
    utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
    nd = new Date(utc + (3600000*offset)); 
    return nd; 
} 

searchdate = time_format(searchdate, '+5.5'); 

'+5.5'這裏是從當地時間到GMT時間的時差。

+0

嗨。這是可能的。但我不認爲這是真的。因爲mongo和應用程序在同一臺服務器上,幾秒鐘甚至幾分鐘甚至幾分鐘。看起來它是祕密問題。 –