Mongoose Aggregate 查询过去一周数据
需求
最近在使用 MongoDB 时遇到一个需求,就是查询过去一周内每天新增的用户数。我使用 Mongoose 来操作数据库,可以通过 aggregate 实现需求。
前提
user 模型:
const UserSchema = mongoose.Schema(
{
username: { type: String, trim: true },
},
{
timestamps: { createdAt: 'createTime', updatedAt: 'updateTime' },
}
)
module.exports = mongoose.model('User', UserSchema)
日期格式:2021-04-11 02:18:51.418Z
分析
首先获取今天的日期,然后筛选出过去一周的用户,最后通过 createTime
进行分组。
实现
const today = new Date()
const day = today.setDate(today.getDate() - 7)
const createTime = { $gte: new Date(day) }
const userGrowth = await UserModel.aggregate([
{ $match: { createTime } },
{
$project: {
everyDay: { $substr: [{ $add: ['$createTime', 28800000] }, 0, 10] },
},
},
{
$group: {
_id: '$everyDay',
count: { $sum: 1 },
},
},
])
$add
操作是因为 MongoDB 存储的数据是按照世界时间存储的,加上 8 小时(毫秒)才是国内时间。
$match
在匹配 createTime
时,记得使用 new Date()
格式化 day
,不然 day
只是个字符串,无法匹配。