如何使用聚合在猫鼬中对文档数组进行分页?

Posted

技术标签:

【中文标题】如何使用聚合在猫鼬中对文档数组进行分页?【英文标题】:How can I paginate a document array in mongoose using aggregate? 【发布时间】:2020-07-26 07:23:48 【问题描述】:

我想对一组名为“Reviews”的文档进行分页,但我找不到方法,因为我执行的代码为我对文档进行了分页,而不是对文档数组“Reviews”进行了分页。

您尝试运行的代码

return await this.animeModel
  .aggregate()
  .match( _id: Types.ObjectId(reviewPaginateData.animeId) )
  .unwind('$reviews')
  .group(
    _id: '$_id',
    reviews:  $push: '$reviews' ,
  )
  .sort(reviewPaginateData.sort)
  .limit(reviewPaginateData.limit)
  .skip(reviewPaginateData.limit * reviewPaginateData.skip)
  .exec();

文档结构

有什么办法可以解决这个问题?非常感谢您。

【问题讨论】:

【参考方案1】:

我对 mongoose 没有太多经验,但我可以编写一个 shell 查询来对数组执行分页。因此,您可以将其集成到 mongoose 中。

您无法分页的原因是您在group 之后应用了skiplimit,这为您提供了一个数组作为输出。因此,要在数组本身上应用分页,您需要使用 $slice 阅读更多信息 here

db.collection.aggregate([
  
    $match:
      "_id":ObjectId("xyz")
    
  ,
  
    $unwind:"$reviews"
  ,
  
    $group:  
      "_id":"$_id",
      "reviews":
        $push:"$reviews"
      
    
  ,
  
    $sort:
      sort_value:1
    
  ,
  
    $project:
      "reviews":
        $slice:[
          "$reviews",
          skip_value,
          limit_value
        ]
      
    
  
]).pretty()

希望这会有所帮助:)

【讨论】:

感谢您提供的信息和代码,它非常适合我。 我很高兴它有帮助:)

以上是关于如何使用聚合在猫鼬中对文档数组进行分页?的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中保存子文档的数组?

在猫鼬中对嵌套数组进行排序

如何在猫鼬中使用聚合

如何仅在猫鼬中获取子文档?

如何仅在猫鼬中获取子文档?

如何使用猫鼬需要验证在猫鼬中插入多个文档?