【问题标题】:mongoose how to get total number of groups for pagination猫鼬如何获得分页组的总数
【发布时间】:2021-06-19 21:28:07
【问题描述】:

我想在以下查询返回的数组上实现分页:

const aggregationQuery : any[]= [
      { 
        $match: filter
      },
      { 
        $group: {
          _id: '$reqID',
          docs:{
            $first: {
                "_id": "$_id",
                "reqID": "$reqID",
                "userID": "$userID",
                "sharerID": "$sharerID",
                "createdAt": "$createdAt",
                "destination": "$destination"
              }
            },
          },
        },
    { $sort: { _id: -1 }},
    { $skip: startingIndex }, 
    { $limit: pageSize }
];

const transfers: IPaginatedTransfer[] = await transferModel.aggregate(aggregationQuery);

startingIndexpageSize 是我想要的页面的指示器。 查询有效,但是我还想知道给定页面大小的页面总数(换句话说,数组中没有跳过和限制的对象总数)。

有没有一种有效的方法来实现它,同时避免查询完整的数组并获取它的长度?

注意:一个简单的countDocuments 不是我想要的,因为我想要分组后的计数。

【问题讨论】:

  • 使用$facet阶段和分离结果,{ $facet: { result: [ { $skip: startingIndex }, { $limit: pageSize } ], count: [ {$count: "count"} ] } }

标签: mongoose pagination mongodb-query grouping aggregation


【解决方案1】:

所以我们想出的解决方案是另一个查询,只是使用计数:

  static async getSize(filter: any): Promise<number> {
    const aggregationQuery : any[] = [
      {
        $match: filter
      },
      {
        $group: {
          _id: '$reqID',
        }
      },
      {
        $count: 'count'
      }];

    const transfersCount: { count: number }[] = await transferModel.aggregate(aggregationQuery);
    return transfersCount.length > 0 ? transfersCount[0].count : 0;
  }

【讨论】:

    猜你喜欢
    • 2017-02-16
    相关资源
    最近更新 更多