如何在 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 中按日期分组的主要内容,如果未能解决你的问题,请参考以下文章