如何在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周创造的工作岗位会返回到第二周,以此类推,从本周开始的前六周。

这就是我的模式在DB:中的样子

{
"_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"}
}
}
])

为了得到与你期望的结果相似的东西。你可以在操场上看到它是如何工作的。

如果将组命名为"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"}
}
}
])

正如你在操场上看到的,

最新更新