2015-06-23 225 views
1

我有在MongoDB中以UTC時間格式插入的數據。我想要根據時區轉換時間。在mongo查詢中是否有可能這樣做?Mongo查詢中的時區

+0

送你想提那些 – Aman

+0

我的格式和格式在2015年6月25日搜索記錄。我有記錄在日期2015-06-24 24:17:51。在查詢時,此記錄A必須根據時區進行轉換並獲得列表。 – user3702039

+0

是'timeZone'保存在文檔中還是外部傳遞的? – Yogesh

回答

3

我們考慮您的文檔如下包含ISODate

db.collection.insert({"date":new Date()}) 

上面的查詢插入dateISODate格式現在你想這個ISODate轉換成給timeZone

假設您想將上述日期轉換爲Eastern Daylight Saving Time (EDT)epoch time zone conertor然後offset轉換爲14400 * 1000。首先將ISODate轉換爲timeStamp,然後使用substract EDT偏移in時間戳and then convert時間戳to ISODate`再次。

檢查下面聚集的查詢:

db.collection.aggregate({ 
    "$project": { 
    "timestamp": { //convert ISODate tom timestamp 
     "$subtract": [{ 
     "$divide": [{ 
      "$subtract": ["$date", new Date("1970-01-01")] 
     }, 1000] 
     }, { 
     "$mod": [{ 
      "$divide": [{ 
      "$subtract": ["$date", new Date("1970-01-01")] 
      }, 1000] 
     }, 1] 
     }] 
    } 
    } 
}, { 
    "$project": { 
    "timeZoneTimeStamp": { 
     "$subtract": [{ //substract timestamp to given offset if offset will in postive then replace subtract to add 
     "$multiply": ["$timestamp", 1000] 
     }, 14400000] 
    } 
    } 
}, { 
    "$project": { 
    "timeZoneTimeStamp": 1, //converted timeZoneTimeStamp if required 
    "_id": 0, 
    "newDate": { // newDate is converted timezone ISODate 
     "$add": [new Date(0), "$timeZoneTimeStamp"] 
    } 
    } 
}) 

: 在上述查詢轉換從ISODATEtimeStampref. here

+0

也可以在這裏看到類似的答案:http://stackoverflow.com/a/31354088/404699 – steampowered

0

在情況下,如果日期不改變,例如恆定就像created_record_date那麼無論你需要哪個時區數據,你都應該預先計算並保存(如字符串)和同一個文檔,這樣你就不必在運行時運行巨大的處理,這可能會減慢執行時間。如果您有現有記錄並且想要將各種不同的時區數據與記錄一起存儲,請考慮運行Map-Reduct作業並分別更新文檔。 (讓我知道如果你需要的代碼)。但是,如果此日期字段可以根據業務邏輯進行更改,那麼它在運行時是明智的。這兩種技術都有其不同的使用案例及其優缺點。

- 3.6時區已添加$

0

在蒙戈版本,mongo doc

則表達式來提取日期部分與時區爲

{ date: <dateExpression>, timezone: <tzExpression> } 

我們可以指定時區或在獲取偏移日期部分。

看到我的答案貼here

從最新獲取日期與時區America/Chicago

{ $month: { 
    date: new Date(), 
    timezone: "America/Chicago" 
} } 

或偏移

{ $month: { 
    date: ISODate(), 
    timezone: "-0500" 
} }