[英]What is the best way to store dates of birth in MongoDB?
我已經閱讀了很多關於如何在 MongoDB 中存儲簡單日期(沒有時間)的信息,但我仍然找不到答案。 有人說像 MongoDate (date + utc time) 這樣存儲主題,有人說像 YYYYMMDD 字符串那樣存儲主題,還有一些像其他有趣的方式。 最正確的方法似乎是 MongoDate,但為什么我應該將出生日期存儲為具有 UTC 時間的日期?
另外,出生日期“1990-05-21”存儲為“1990-05-20T23:00:00Z”(前一天):此日期不應因時區而異,但在全球范圍內保持不變。
我仍然想知道為什么 MongoDB 不像所有其他數據庫那樣提供簡單的“日期”類型。
只需使用:
new Date("<YYYY-mm-dd>");
它返回具有指定日期而沒有時間戳的 ISODate。 MongoDB 使用 ISO-8601 日期表示法來表示日期對象。 這樣,提供了很多日期操作。 IE
new Date("<YYYY-mm-dd>")
返回具有指定日期的 ISODate。
new Date("<YYYY-mm-ddTHH:MM:ss>")
指定客戶端本地時區中的日期時間並返回具有指定日期時間的 ISODate UTC。
new Date("<YYYY-mm-ddTHH:MM:ssZ>")
指定 UTC 中的日期時間並返回具有指定 UTC 日期時間的 ISODate。
new Date(<integer>)
將日期時間指定為自 Unix 紀元(1970 年 1 月 1 日)以來的毫秒數,並返回結果 ISODate 實例。
更重要的是,在內部,日期對象存儲為一個有符號的 64 位整數,表示自 Unix 紀元(1970 年 1 月 1 日)以來的毫秒數。
正如評論中提到的,它幾乎取決於您的最終目標。 我建議您使用 MongoDate,因為它是 MongoDB 中日期的本機格式,並且可以讓其他開發人員保持直觀。 並且本機類型支持一系列開箱即用的有用方法,例如,您可以在 map-reduce 作業中使用這些方法。
另外,出生日期“1990-05-21”存儲為“1990-05-20T23:00:00Z”(前一天)
我認為發生這種情況只是因為您服務器上的時區是 UTC+1。 您可以在保存到數據庫之前手動將時區設置為 UTC,它將解決您的問題。
將其存儲為一個簡單的字符串“1985-21-07”。 這聽起來可能違反直覺並點亮您的紅色“數據庫類型”燈泡,但是將出生日期保存為 Date() 會帶來許多“部分”(小時、分鍾、秒......)在 mongo 中保存和獲取出生日期時會引起頭痛並容易出錯。
在此處閱讀最高答案(不是標記為正確的答案): 在 MongoDB 中存儲日期的最佳方法是什么?
這是一個有趣的問題,不容易回答。 正如@Andrey Degtyaruk已經注意到這一切都與這些數據的目的有關。
就我而言,我解決了幾乎相同的問題,如下所示:
store time like a YYYYMMDD string
但是,有點不同的方式。 因為“時間戳”字段已經被 MongoDB 保留(根據 BSON 文檔),我將日期轉換為時間戳( 如果您感興趣,可以使用這些 js 腳本之一)並將其存儲在數據庫中作為“lastModified”:“Number”。
我不確定我的方法是否適用於您的出生日期案例,但它仍然是一種方法,您可以嘗試一下。
我也在尋找這個問題的最佳解決方案,在閱讀這些答案時,我認為最簡單的解決方案是忽略時間和時區變化,但仍然允許對人的年齡等進行比較和查詢。沿 YYYYMMDD 行的整數格式。
因此,對於 1980 年 3 月 12 日的出生日期,這將保存為整數 19800312。
然后我找到了 Mongoose 的這個插件,它或多或少是這樣的: https : //github.com/boblauer/mongoose-dateonly
唯一的缺點是,如果您想使用聚合框架,則必須直接使用 DateOnly。
ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()
返回:
ISODate("2012-10-15T21:26:17Z")
無論如何,您只需轉換時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.