如何在 MongoDB 中按日期分组

Posted

技术标签:

【中文标题】如何在 MongoDB 中按日期分组【英文标题】:How can I group by dates in MongoDB 【发布时间】:2017-10-22 09:19:54 【问题描述】:

我正在寻找创建一个时间线 REST api,它将提取 MongoDB 数据条目并使用我在集合中拥有的 created_at 属性组织它们。

我希望通过几个不同的分组来分隔“时间线”条目。

第一组是“过去 24 小时”,第二组是“昨天”,第三组是“上周”,最后一组是“其他一切”。我将限制“其他所有内容”,这样它就不会从很久以前拉出一堆东西......

我在 Mongoose 中所做的是按我的 created_at 分组的 MongoDB $group,但我遇到了问题,因为我只是想做一个 created_at “like”,因为我不能使用确切的时间戳或分组不起作用。

有没有人有类似的经验?我想如何将其扩展为使用多个分组,我可以先按“今天”(过去 24 小时)分组,然后按周或“上周”分组其他所有内容?

我需要先做一个分组,然后在我的下一个分组中排除之前分组的结果。

感谢您的宝贵时间。

【问题讨论】:

您需要在管道中添加一个 docs.mongodb.com/manual/reference/operator/aggregation/… 字段,添加一个带有日期运算符的新字段以包括 YYYY-DayOfYear 和另一个用于 YYYY-WeekOfYear。 docs.mongodb.com/manual/reference/operator/aggregation-date然后你根据这两个新添加的字段进行分组 您可以使用$facet。您将需要结合 $facet example 和 $group 通过 range 示例。 【参考方案1】:

为什么不把它分成三个查询呢? 今天的第一个查询:

   var today = new Date();
   var startOfToday = new Date(today.getFullYear(), today.getMonth(), today.getDate());
   MyModel.find(created_on: $gte: startOfToday, function (err, docs)  ... );

昨天的第二次查询:

   var yesterday = new Date();    
   yesterday = yesterday.setDate(today.getDate() - 1);
   var startOfYesterday = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
   MyModel.find(created_on: $gte: startOfYesterday, $lt: startOfToday, function (err, docs)  ... );

第三次查询其他内容:

   MyModel.find(created_on: $lt: startOfYesterday, function (err, docs)  ... );

【讨论】:

以上是关于如何在 MongoDB 中按日期分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中按日期对集合进行排序?

如何在 React Native 中按日期分组

如何在 SQL 中按多列分组并按日期排序?

如何在另一列中按条件分组的列中查找下一个日期?

pandas 如何使用 groupby 在标签中按日期对列进行分组?

如何在 Jooq 中按月和年将毫秒翻译成日期和分组?