簡體   English   中英

在 MongoDB 中存儲出生日期的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM