Mongodb从最近X周开始的文档计数-而非最近XX天

问题描述 投票:0回答:2

尽管这里有类似的问题,如何在特定星期范围内查找/计数文档,但我无法找出如何匹配/计算最近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天。

示例-从星期三开始的查询:

  • [过去7天:上周:[星期四,星期五,星期六,星期日] |当前周:[周一,周二,周三]
  • [上周:​​上周:[星期一,星期二,星期三,星期四,星期五,星期六,星期日] |当前星期:[]

查询应该返回正确的结果,无论是从一周的第一天还是一周的最后一天开始。另外,还必须考虑年份的变化-12月的最后一周具有第52周,一月的第一周具有第1周。

[其他潜在问题可能会因几周而没有任何相关文件而导致。您无法按照周号对最近21天的文档进行分组,而使用$sort" and $ limit`,因为没有任何相关文档的周不会出现在分组中。

mongodb date week-number
2个回答
0
投票

尝试再添加两个阶段,首先根据组_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
       }
    ])

0
投票

[花了一些认真的时间试图根据$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周)

© www.soinside.com 2019 - 2024. All rights reserved.