kaname-png
kaname-png

Reputation: 117

How can I paginate a document array in mongoose using aggregate?

I want to paginate an array of documents called "Reviews" but I can't find a way to do it, since the code I execute paginate the documents for me and not the array of documents "Reviews".

Code you tried to run

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();

Document structure

Document structure

Any way to solve this problem? Thank you very much in advance.

Upvotes: 1

Views: 1045

Answers (1)

Vijay Rajpurohit
Vijay Rajpurohit

Reputation: 1352

I don't have much experience with mongoose, but I can write a shell query to perform the pagination on an array. So, that you can integrate it in mongoose.

The reason you are not able to paginate is that you are applying the skip and limit after group which is giving you an array as output. So, to apply pagination on the array itself you need to use $slice for more read 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()

Hope this will help :)

Upvotes: 2

Related Questions