【发布时间】:2015-09-29 23:14:42
【问题描述】:
我正在构建将在意大利使用的 mongodb 和 nodejs 应用程序。意大利时区是 +02:00 。这意味着如果有人在 7 月 11 日凌晨 1 点保存一些数据,那么它将保存为 7 月 10 日晚上 11:00,因为 mongo 以 UTC 保存日期。 我们需要显示日期明智的 tx 计数。所以我按日期查询分组。但它显示前一天的交易。应该有什么解决方法。
> db.txs.insert({txid:"1",date : new Date("2015-07-11T01:00:00+02:00")})
> db.txs.insert({txid:"2",date : new Date("2015-07-11T05:00:00+02:00")})
> db.txs.insert({txid:"3",date : new Date("2015-07-10T21:00:00+02:00")})
> db.txs.find().pretty()
{
"_id" : ObjectId("55a0a55499c6740f3dfe14e4"),
"txid" : "1",
"date" : ISODate("2015-07-10T23:00:00Z")
}
{
"_id" : ObjectId("55a0a55599c6740f3dfe14e5"),
"txid" : "2",
"date" : ISODate("2015-07-11T03:00:00Z")
}
{
"_id" : ObjectId("55a0a55699c6740f3dfe14e6"),
"txid" : "3",
"date" : ISODate("2015-07-10T19:00:00Z")
}
> db.txs.aggregate([
{ $group:{
_id: {
day:{$dayOfMonth:"$date"},
month:{$month:"$date"},
year:{$year:"$date"}
},
count:{$sum:1}
}}
])
{ "_id" : { "day" : 11, "month" : 7, "year" : 2015 }, "count" : 1 }
{ "_id" : { "day" : 10, "month" : 7, "year" : 2015 }, "count" : 2 }
它在 7 月 10 日显示 2 笔交易,在 7 月 11 日显示 1 笔交易。但我们需要显示 7 月 11 日的 2 笔交易和 7 月 10 日的 1 笔交易。
当时是意大利的 7 月 11 日
db.txs.insert({txid:"1",date : new Date("2015-07-11T01:00:00+02:00")})
发生但 mongo 将日期存储为:
ISODate("2015-07-10T23:00:00Z")
【问题讨论】:
-
如果“新西兰”的人想查看“意大利”的人提交的数据怎么办?那你应该如何存储时间呢?这就是为什么使用 UTC 日期的原因,因为它们对每个人都代表相同的时间点。在您的“客户端”上转换为本地时间,并对“查询参数”执行相同的操作,获取本地日期,然后将它们转换回 UTC。这样查询和数据在全球范围内都是一致的。
-
@BlakesSeven 但很可能是该组通过显示上一个日期的记录。在 mongo 上进行分组查询时是否可以传递一些参数,如日期区域?
标签: node.js mongodb datetime mongodb-query aggregation-framework