尽管这里有类似的问题,如何在特定星期范围内查找/计数文档,但我无法找出如何匹配/计算最近X周的文档。考虑以下查询:
db.getCollection('post').aggregate([
{
$match: {
createdDate: {'$gte': new Date(new Date() - 7 * 60 * 60 * 24 * 1000)},
}
},
{
$group: {
_id: {$week: '$createdDate'},
count: {$sum: 1}
}
}
])
此查询对最近7天的文档进行计数,并按周数对计数进行分组-但结果实际上包含两个字段:当前周的文档数和从该天开始的上周起的文档数是当前日期-7天。
示例-从星期三开始的查询:
查询应该返回正确的结果,无论是从一周的第一天还是一周的最后一天开始。另外,还必须考虑年份的变化-12月的最后一周具有第52周,一月的第一周具有第1周。
[其他潜在问题可能会因几周而没有任何相关文件而导致。您无法按照周号对最近21天的文档进行分组,而使用$sort" and
$ limit`,因为没有任何相关文档的周不会出现在分组中。
尝试再添加两个阶段,首先根据组_id即星期数对它们进行排序,然后将结果限制为1
db.getCollection('post').aggregate([
{
$match: {
createdDate: {'$gte': new Date(new Date() - 15 * 60 * 60 * 24 * 1000)},
}
},
{
$group: {
_id: {$week: '$createdDate'},
count: {$sum: 1}
}
},
{
$sort:{
_id:-1
}
},
{
$skip:1
},
{
$limit:1
}
])
[花了一些认真的时间试图根据$week
运算符找到自己的解决方案,并决定将其发布在这里,但最终我意识到,harshit kohli建议的方法更好。我稍后再解释。
db.getCollection('post').aggregate([
{ // optional, can pre-sort your collection, so you don't add fields to every document in a huge collection
$match: {
createdDate: {'$gte':new Date(new Date().setDate(new Date().getDate() - 2 * 7 + 1))},
}
},
{
$addFields: {
createdInWeek: { $week: '$createdDate' },
currentWeek: { $week: new Date() },
}
},
{
$match: { // use of $expr. necessary since MongoDb 3.6 see https://stackoverflow.com/a/58567621/1991697
$expr: {
$and: [
{$lte: ["$createdInWeek", { $subtract: ["$currentWeek", 1] } ]},
{$gte: ["$createdInWeek", { $subtract: ["$currentWeek", 2] } ]},
]
}
}
},
{
$group: {
_id: {$week: '$createdDate'},
count: {
$sum: 1
}
}
},
])
这种方法让Mongo为您集合中的每个文档计算当前星期和createdDate
的星期数,然后您可以使用其他$match
运算符进行简单的文件处理。它还使您可以更轻松地设置星期范围。
BUT
如果您的周班时间跨一年休息,这可能会失败。 (第一月的第一周是第0周,最后的十二月是第52周)