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

ymdaylpp  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(146)

所以我用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'})) });

有没有更好的选择

gmxoilav

gmxoilav1#

就我理解你的问题而言,如果你需要在前端显示数据之前应用一些日期格式,你只需要在显示之前将检索到的日期传递到一个日期格式库中,就像在JS中一样:const d =新日期(“2015年3月25日12:00:00 Z”);
然而,如果你想得到格式化形式的日期,那么你必须在存储前格式化它。我希望这能回答你的问题。

bgibtngc

bgibtngc2#

我认为来自@Fabian Strathaus在评论中的警告是一个重要的考虑因素。我强烈建议你尝试解决的方法为你的整体成功奠定基础,而不是在项目的其他地方引入新的痛点。
假设您 * 希望 * 这样做,另一种方法是直接请求数据库这样做。更具体地说,the $dateToString operator听起来在这里可能有用。This playground example通过添加一个格式化的日期字段来演示基本行为,该字段将直接从数据库返回。它采用以下文档:

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

您可以通过多种方式使用此字段,例如通过creating and querying a view,它将自动创建并返回此格式化字段。
我还想评论一下你的这句话:
目前,我已经添加了下面的工作,但我必须循环通过所有行,这将是一个大数据的性能噩梦。
很高兴听到您在考虑性能问题。也就是说,您的查询包含name:{$regex: search, $options: 'i'}的查询 predicate 。非锚定和/或不区分大小写的正则表达式过滤器无法有效地使用索引。因此,如果您的status predicate 没有选择性,那么您可能需要考虑在name上进行过滤的替代方法,以确保查询的性能。

相关问题