我们有一个简单的应用程序,其中所有用户都位于同一时区,因此我们不感兴趣将时区信息存储在 mongo 日期对象中。
采取如此极端措施的原因是我们有多个微服务,使用由不同开发人员管理的通用数据库。他们每个人都需要在查询中显式设置时区相关的内容并忘记无效数据集中的相同结果。
由于目前 MongoDB 人员Mongo 数据类型
不支持存储没有时区的日期。
只是想知道他们在 mongo 中表示没有时区的日期的任何替代方法,我们仍然可以利用 mongo 数据库查询基于日期的语法,如日期范围、日期等。
同时DBA可以方便地读取和管理记录。
看看这个答案:https://stackoverflow.com/a/6776273/6105830
您可以使用两种类型的长表示(毫秒或格式 yyyyMMddHHmmss)。这些是不存储时区但仍然能够进行范围查询的唯一方法。
不幸的是,您丢失了一些聚合属性。但是您可以做一些事情,例如保留两种表示形式并在适当的时候使用它们。
更新:
不要像我之前说的那样存储日期。您将失去 MongoDB 的许多功能,并且也将很难在日期字段上执行主要运算符。
较新版本的 MongoDB 有处理时区的运算符,它应该足以处理 ISOTime 格式。我的应用程序使用我自己的建议来存储日期。现在我必须让我的用户选择他们的时区(公司已经发展壮大,我们需要扩展到其他国家)。我们正在努力更改所有模型以使用时间戳而不是标准化日期格式。 如需了解更多信息,请浏览链接:https://docs.mongodb.com/manual/reference/method/Date/
您也可以通过MongoDB官方社区渠道进行提问 这是链接:https://developer.mongodb.com/community/forums/
您可以考虑以 UTC 格式存储所有日期并以 UTC 格式呈现给用户,这样就不会出现客户端 JavaScript、服务器或 MongoDB 静默转换的问题,从而避免混乱。 你可以这样做: new Date(Date.UTC(2000, 01, 28)) 这是有关该主题的 MDN 链接。
创建一个单独的 date.js 模块并将其导出
function formatDate(dateString) {
const date = new Date(dateString);
const day = String(date.getDate()).padStart(2, "0"); // Add leading zero if single digit
const monthIndex = date.getMonth();
const year = date.getFullYear().toString().slice(0); // Get the last two digits of the year
const formattedDate = `${year}-${String(monthIndex + 1).padStart(
2,
"0"
)}-${day}`; // Add leading zero if single digit
return formattedDate;
}
module.exports = formatDate;
然后将其导入到您的主应用程序 const
formatDate = require("./date");
然后在日期字段中将您的架构更改为类似的内容,我的看起来像这样
const clientSchema = new mongoose.Schema({
name: String,
phone: String,
acc: Number,
radio: String,
date: { type: String, default: formatDate(new Date().toISOString()) },
amount: String,
due: String,
});
将日期类型更改为 STRING