如何在 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"
}
所以问题是:
- 获取我过去六周的所有物品的最佳方式是什么?上面的片段是否正确?我不太自信
- 如何按周对它们进行分组并获得整个对象?假设在第 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 上看到的那样
我有一个填充了数据的 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"
}
所以问题是:
- 获取我过去六周的所有物品的最佳方式是什么?上面的片段是否正确?我不太自信
- 如何按周对它们进行分组并获得整个对象?假设在第 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 上看到的那样