所以我用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
是 Mongoose 模型
我想修改一些对象,比如在返回数据之前应用日期格式,同时仍然如上所述分页。
目前,我已经添加了下面的工作,但我必须循环通过所有行,这将是一个大数据的性能噩梦。
res.json({ count, rows:rows.map(el=>({...el,created_at:'format date here'})) });
有没有更好的选择
2条答案
按热度按时间gmxoilav1#
就我理解你的问题而言,如果你需要在前端显示数据之前应用一些日期格式,你只需要在显示之前将检索到的日期传递到一个日期格式库中,就像在JS中一样:const d =新日期(“2015年3月25日12:00:00 Z”);
然而,如果你想得到格式化形式的日期,那么你必须在存储前格式化它。我希望这能回答你的问题。
bgibtngc2#
我认为来自@Fabian Strathaus在评论中的警告是一个重要的考虑因素。我强烈建议你尝试解决的方法为你的整体成功奠定基础,而不是在项目的其他地方引入新的痛点。
假设您 * 希望 * 这样做,另一种方法是直接请求数据库这样做。更具体地说,the
$dateToString
operator听起来在这里可能有用。This playground example通过添加一个格式化的日期字段来演示基本行为,该字段将直接从数据库返回。它采用以下文档:然后,我们执行以下示例聚合:
返回的文档为:
您可以通过多种方式使用此字段,例如通过creating and querying a view,它将自动创建并返回此格式化字段。
我还想评论一下你的这句话:
目前,我已经添加了下面的工作,但我必须循环通过所有行,这将是一个大数据的性能噩梦。
很高兴听到您在考虑性能问题。也就是说,您的查询包含
name:{$regex: search, $options: 'i'}
的查询 predicate 。非锚定和/或不区分大小写的正则表达式过滤器无法有效地使用索引。因此,如果您的status
predicate 没有选择性,那么您可能需要考虑在name
上进行过滤的替代方法,以确保查询的性能。