【问题标题】:Mongoose operation to count by date range猫鼬操作按日期范围计数
【发布时间】:2018-05-25 11:49:46
【问题描述】:

我有大量的时间序列数据,我想每天计算。

例如,假设我想查询从 3 天到现在的日期范围。假设 3 天前有 1000 个错误,2 天前有 2000 个错误,今天有 500 个。我的对象有一个“创建”日期字段。

为此我可以做到

MyModel.count( { created: { $gte: threeDaysAgo, $lte: today } })

然后重复另外两天。当用户想要搜索 300 天的跨度时,这会成为一个问题——我必须进行 300 次操作。所以我想跳过个别查询。

是否有 Mongoose / MongoDB 操作可以将这些总和返回给我,而无需每天单独调用?

【问题讨论】:

  • 我不知道。您可以查询 3 天并选择创建日期,然后根据结果计算您的计数。
  • 谢谢吉姆,没想到这一点。不过有点担心性能 - 可能有 200,000 多个对象被退回。但我想只选择创建的字段会提高性能。
  • 如果太多,三个“计数”事务可能会更好。

标签: mongodb mongoose


【解决方案1】:

我最终选择了聚合。这是我的代码:

             DBLogData.aggregate([
                {
                    $match: { application: application.id }
                },
                {
                    $group: {
                        _id: {
                           day: {
                              $dayOfMonth: "$created"
                          },
                          month: {
                              $month: "$created"
                          },
                          year: {
                              $year: "$created"
                          }
                      },
                        count: {
                            $sum: 1
                        }
                    }
                }
            ], (error, graphCountDatas) => {
                if (error) {
                    console.log(error);
                    callback(error);
                } else {
                    callback(null, graphCountDatas);
                }
            });

还有一些参考资料:

https://docs.mongodb.com/v3.4/aggregation/ https://docs.mongodb.com/v3.4/reference/operator/aggregation-date/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多