Mongoose mongodb在返回分页之前修改数据



所以我用mongoose获取数据,我想修改数据,比如应用一些日期格式。目前我有

const count = await UserModel.countDocuments();
const rows = await UserModel.find({ name:{$regex: search, $options: 'i'}, status:10 })
.sort([["updated_at", -1]])
.skip(page * perPage)
.limit(perPage)
.exec();

res.json({ count, rows });

上述UserModel为猫鼬型

我想修改一些对象,比如在返回数据之前应用日期格式,同时仍然如上所述进行分页。

目前,我已经添加了以下内容,这些内容有效,但我必须遍历所有行,这将是大数据的性能问题。

res.json({ count, rows:rows.map(el=>({...el,created_at:'format date here'})) });

有更好的选择吗

尽管我理解你的问题,但如果你需要在前端显示数据之前应用一些日期格式,你只需要在显示日期之前将检索到的日期传递到日期格式化库中,就像JS中一样:const d=新日期("2015-03-25T12:00:00Z"(;

但是,如果您想以格式化的形式获取日期,则必须在存储之前对其进行格式化。我希望这能回答你的问题。

我认为@Fabian Strathaus在评论中的警告是一个重要的考虑因素。我强烈建议您尝试解决的方法为您的整体成功做好准备,而不是在项目的其他地方引入新的痛点。

假设希望执行此操作,另一种方法是要求数据库直接执行此操作。更具体地说,$dateToString运算符听起来可能在这里有用。这个操场示例通过添加一个格式化的日期字段来演示基本行为,该字段将直接从数据库返回。它需要以下文档:

{
_id: 1,
created_at: ISODate("2022-01-15T08:15:39.736Z")
}

然后我们执行这个样本聚合:

db.collection.aggregate([
{
"$addFields": {
created_at_formatted: {
$dateToString: {
format: "%m/%d/%Y",
date: "$created_at"
}
}
}
}
])

返回的文档是:

{
"_id": 1,
"created_at": ISODate("2022-01-15T08:15:39.736Z"),
"created_at_formatted": "01/15/2022"
}

您可以通过多种方式使用它,例如创建和查询一个视图,该视图将自动创建并返回此格式化字段。

我还想对你的发言发表评论:

目前我已经添加了以下内容,这些内容有效,但我必须遍历所有行,这将是大数据的性能问题。

很高兴听到您在提前考虑性能。也就是说,您的查询包含name:{$regex: search, $options: 'i'}的查询谓词。未绑定和/或不区分大小写的正则表达式筛选器无法有效使用索引。因此,如果您的status谓词不是选择性的,那么您可能需要考虑在name上进行筛选的其他方法,以确保查询具有性能。

最新更新