微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询 Mongo 的时间跨度今天、过去 7 天等计数与时区

如何解决查询 Mongo 的时间跨度今天、过去 7 天等计数与时区

我正在用 Node + Mongo 构建一个日志应用程序。我的 Mongo 数据库有两个模型,日志和存储桶。日志存储在桶中。每个日志都有一个 createdAt 日期,它在 UTC 时区(服务器认值)中仅为 new Date()。每个存储桶都有一个时区设置,用户可以随时设置和更新,我希望日志在向用户显示时反映正确时区中的正确时间。

我遇到的问题是我不知道如何正确获取“时间跨度”,即(今天、过去 7 天、过去 30 天等)同时考虑时区。我正在构建一个图表,因此我想获取时间跨度内每个时间段的日志计数,即今天每小时的日志或过去 7 天每天的日志。

到目前为止,考虑到“今天的每一小时”示例,以下是我所做的:

const { convertToTimeZone } = require('date-fns-timezone');

const { subDays,startOfDay } = require('date-fns'); const bucketTimezone = 'America/New_York'; // 正常从桶中获取

const Now = new Date();
const difference = 0; // 0 = Today,7 = Last 7 days,etc.
const start = subDays(Now,difference);
const end = Now;
const convertedStart = startOfDay(convertToTimeZone(start,{ timeZone: bucketTimezone })); // I want logs from the start of the day 12:00:00
const convertedEnd = convertToTimeZone(end,{ timeZone: bucketTimezone }); 

const data = await req.db.collection('logs').aggregate([
  // Get only records created in between converted dates
  {
    $match: { createdAt: { $gte: convertedStart,$lte: convertedEnd } },},// Group by year,month,day,hour to get count down to the hour
  {
    $group: {
      _id: {
        year: { $year: '$createdAt' },month: { $month: '$createdAt' },day: { $dayOfMonth: '$createdAt' },hour: { $hour: '$createdAt' },count: { $sum: 1 },{
    $sort: {
      '_id.year': 1,'_id.month': 1,'_id.day': 1,'_id.hour': 1,]).toArray();

现在我的代码逻辑已经有不少问题了。

如果我添加一个日志,它是在 UTC 时间添加的。然后如果我立即查询,新日志将不会返回,因为 EST 时间是结束日期前 4 小时,并且不会被包含。

一个合乎逻辑的步骤是删除 convertToTimeZone 调用,只使用普通的 startend 来创建范围并在返回日期之前转换日期。但是,如果我使用 UTC 日期来制作 start 日期,那么这将包括在 UTC 上午 12:01:00 放入的日志,但是当我将其转换为 EST 时,它们现在将是 8:01 :00 PM UTC 前一天,不属于“今天”,但我已经运行了我的组并计算查询,所以为时已晚。

那么,在分组和计数过程中,我如何正确执行此操作并按时间跨度分组,同时考虑到时区?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。