如何在 MongoDB 中按日期范围 -weekly- 获取然后分组?

How to get and then group by date range -weekly- in MongoDB?

我有一个填充了数据的 MongoDB 数据库,我试图在特定时间范围内查询并获取结果,在本例中为数周。我正在这样查询,这可能不正确(?),以获取过去 6 周内创建的所有对象:

let weeklyPie = await Job.aggregate([
{ $match: { createdBy: mongoose.Types.ObjectId(req.user.userId) } },
{
  $match: {
    dateCreated: {
      $gte: moment().week(-6).toDate(),
      $lt: moment().startOf('week').toDate(),
    },
  },
},

]);

这应该会返回我在过去六周内创建的所有工作。

此外,我想按周对它们进行分组,因此在第 14 周(当前周)创建的所有作业都返回到名为 weekOne 的组中,在第 13 周创建的作业返回到名为 weekTwo 的组中,依此类推从当前一周开始的前六周。

这是我的模式在数据库中的样子:

{
        "_id": "6242dc818cd686716633be36",
        "company": "Ledner Inc",
        "position": "VP Product Management",
        "status": "interview",
        "jobType": "part-time",
        "jobLocation": "San José de Feliciano",
        "dateCreated": "2022-03-27T21:24:36.000Z",
        "createdBy": "62399147d817b82f5fe8f927",
        "createdAt": "2022-02-16T04:06:46.000Z",
        "updatedAt": "2022-04-07T10:51:05.171Z",
        "__v": 0,
        "interviewTime": "2022-04-20T16:30:00.000Z"
    }

所以问题是:

  1. 获取我过去六周的所有物品的最佳方式是什么?上面的片段是否正确?我不太自信
  2. 如何按周对它们进行分组并获得整个对象?假设在第 14 周创建了 4 个工作,我想只为那一周获取所有 4 个对象,第 13 周也是如此,依此类推。

有什么提示吗?

看来你可以使用 $week$group。有一个没有组名的简单解决方案:

db.collection.aggregate([
  {
    $match: {
      createdBy: mongoose.Types.ObjectId(req.user.userId),
      dateCreated: {
        $gte: moment().startOf('week').week(-6).toDate(),
        $lt: moment().startOf('week').toDate()
      },
    }
  },
  {
    "$addFields": {
      "week": {$week: "$dateCreated"}
    }
  },
  {
    $project: {data: "$$ROOT"}
  },
  {
    $group: {
      _id: "$data.week",
      week: {$first:"$data.week"},
      data: {$push: "$data"}
    }
  }
])

为了得到类似于您预期的结果。 您可以在 playground.

上看到它是如何工作的

如果将组命名为 'weekOne'、'weekTwo' 很重要,您可以通过添加一个步骤来完成,即从给定的组名称列表中找到周组名称:

db.collection.aggregate([
  {
    $match: {
      createdBy: mongoose.Types.ObjectId(req.user.userId),
      dateCreated: {
        $gte: moment().startOf('week').startOf('week').toDate(),
        $lt: moment().startOf('week').toDate()
      },
    }
  },
  {
    "$addFields": {
      "weekNum": {$week: "$dateCreated"},
      "currentWeek": {$week: ISODate("2022-04-07T21:24:36.000Z")},
    }
  },
  {
    $project: {
      data: "$$ROOT",
      weeksOrder: [
        "WeekOne",
        "WeekTwo",
        "WeekTree",
        "WeekFour",
        "WeekFive",
        "WeekSix"
      ],
      weekIndex: {$subtract: ["$currentWeek", "$weekNum"]
      }
    }
  },
  {
    $project: {
      data: 1,
      weekGroup: {"$arrayElemAt": ["$weeksOrder", "$weekIndex"]}
    }
  },
  {
    $group: {
      _id: "$weekGroup",
      week: {$first: "$weekGroup"},
      data: {$push: "$data"}
    }
  }
])

正如您在 playground 上看到的那样