查询 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 (将#修改为@)