我的 Mongo 資料庫中有這個集合:
id | place | local time
--------------------------
3 | A | 12pm
4 | A | 11pm
5 | B | 4pm
6 | | 7pm
本地時間存盤為帶有 UTC 時區的 ISODates。本地時間 12 表示為2022-01-01T12:00:00.000Z。
在資料庫之外,我在地點和時區之間有部分完整的映射。
place | timezone
A | Europe/London
B | Europe/Brussels
使用此資訊,我想通過添加捕獲時區并修復日期偏移量的新欄位來使我的資料庫行具有時區意識。這將是我理想的結果:
id | place | local time | newDate | timezone
----------------------------------------------------------------------------
3 | A | 12pm | ISODate("2022-07-01T11:00:00Z") | Europe/London
4 | A | 11pm | ISODate("2022-07-01T22:00:00Z") | Europe/London
5 | B | 4pm | ISODate("2022-07-01T14:00:00Z") | Europe/Brussels
6 | | 7pm | ISODate("2022-07-01T07:00:00Z") | UTC
添加時區列是直截了當的,我遍歷我的映射表并為每個表構建一個更新陳述句,如下所示:
db.testcollection.updateMany({ place: "A" }, { $set: { "timezone" : "Europe/London" }});
處理該地點的時區未知的位置(我們回退到僅使用 UTC)也很簡單:
db.testcollection.updateMany({ "timezone" : { $exists: false } }, { $set: { "timezone" : "UTC" }});
但是我似乎不能做的是使用 Mongo update 陳述句一次將時區更改本身應用于多行(具有相同的位置)。我不完全確定這是否可能。
我試過了:
rs0 [direct: primary] test> db.testcollection.updateMany({ place: "A" }, { $set: { "utctime" : { $dateAdd: { startDate: "$localtime", amount: 1, unit: "hour" }}}});
它可以通過添加/減去一個小時左右來改變時間,但實際上應用我想要的時區更改對于功能來說太難了$dateAdd。歐洲/倫敦有格林威治標準時間/英國夏令時,取決于夏令時,某些年份已經和放棄了不同的歷史價值:https ://en.wikipedia.org/wiki/Daylight_saving_time_by_country
即使是一系列基于時間的過濾子句似乎也非常復雜。
我要應用的更新與 Java 函式基本相同:
correctUTC = localTimeMarkedAsUTC // 9pm local time
.withZoneSameLocal(portTimezone) // 9pm Europe/London
.withZoneSameInstant(UTC) // 8pm UTC
我可以在更新函式中使用 Date 物件,但我仍然在努力研究如何操作$dateToString和朋友生成我想要的輸出:
test> db.testcollections.updateMany({ place: "A" }, [{ $set: { "utctime" : { $convert : { input: { $dateToString: { date: "$localtime", format: "%Y-%m-%dT%H:%M:%S%z", timezone: "UTC" }}, to: "date" }}}}]);
設定為已設定的相同內容。使用倫敦時區只會增加一個小時。我想要相反的結果,即從 UTC 變數中減去一個小時。
由于資料庫的大小,我更喜歡一個解決方案,它可以在整個位置上批量更新,或者不.forEach(function(e){ ... })用于命中每條記錄,除非這是最后一個可行的解決方案?
我在 Mongo 5.0
uj5u.com熱心網友回復:
試試這個:
db.collection.updateMany(
{timezone: {$ne: "UTC"} }, // UTC times do not need any correction
[
{
$set: {
newDate: {
$dateFromString: {
// "cut" wrong time zone
dateString: {
$dateToString: {
date: "$newDate",
format: "%Y-%m-%dT%H:%M:%S.%L"
}
},
format: "%Y-%m-%dT%H:%M:%S.%L",
timezone: "$timezone" // "attach" correct time zone
}
}
}
}
]
)
蒙戈游樂場
uj5u.com熱心網友回復:
你只需要用 [] 包裝它來創建一個管道:
db.collection.update({
place: "A"
},
[{
$set: {
"utctime": {
$dateAdd: {
startDate: "$localtime",
amount: 1,
unit: "hour"
}
}
}
}],
{
multi: true
})
正如你在這里看到的。哪個可以與批量操作一起使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461747.html
上一篇:更改日期格式
