【问题标题】:Extract data off mongodb database per each day from past week过去一周每天从 mongodb 数据库中提取数据
【发布时间】:2020-10-14 12:49:51
【问题描述】:

我正在使用nodeJS,并且我有一个 MongoDB 表,其中有包含我自己创建的字段 timestamp 的文档。文档中此字段的示例:timestamp: "24-09-2020 08:25:55.301"。我想从表格中提取数据,每天的文件计数器。这意味着我想获取过去每个工作日有多少文档(使用 timestamp 字段)。

我想从查询中得到的完美数据是一个大小为7 的数组,每个数组项描述了在这个日期找到了多少文档。

我该怎么做?

【问题讨论】:

  • 您可以编写一个聚合查询并获得所需的结果。您可能想看看$matchgroup 阶段。
  • 尝试使用字符串“MongoDB aggregation grouping by date”搜索网络 - 您会发现一些与您的问题类似的帖子。

标签: node.js mongodb mongoose


【解决方案1】:

您应该从不将日期/时间值存储为字符串,始终使用正确的 Date 对象。

一个解决方案是这个:

db.collection.aggregate([
   {
      $set: {
         timestamp: {
            $dateFromString: {
               dateString: "$timestamp", format: "%d-%m-%Y %H:%M:%S.%L", timezone: "Europe/Zurich"
            }
         }
      }
   },
   { $match: { timestamp: { $gte: moment.tz('Europe/Zurich').subtract(7, 'days').startOf('day').toDate() } } },
   {
      $group: {
         _id: {
            $dateFromParts: {
               year: { $year: { date: "$timestamp", timezone: "Europe/Zurich" } },
               month: { $month: { date: "$timestamp", timezone: "Europe/Zurich" } },
               day: { $dayOfMonth: { date: "$timestamp", timezone: "Europe/Zurich" } },
               timezone: "Europe/Zurich"
            }
         },
         documents: { $sum: 1 }
      }
   },
   { $project: { timestamp: "$_id", documents: 1, _id: 0 } }
])

【讨论】:

  • 为了向后兼容建议使用$addFields 而不是$set
  • 时间戳是字符串的情况是否有解决方案?如果时间戳是日期,您能否对其进行编辑?
  • 如果字段timestamp 已经是Date 对象,只需跳过将字符串转换为日期的第一阶段($set
  • @KunalMukherjee,我用 Mongo 4.2 开始了我的 Mongo 载体,所以我已经习惯了$set
  • 我做了npm i moment 然后const moment = required('moment')。为什么说TypeError: moment.tz is not a function.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2017-11-05
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多