我正在研究 mongoDB 聚合管道。我坚持要获取记录总数

问题描述 投票:0回答:1

我正在使用 MONGODB 聚合框架,并尝试编写一个通用的分页管道,它可以为我们提供记录总数。当我简单地查询它时它工作正常,但是当我传递搜索参数时,它给出了总文档的记录数而不是匹配的记录数。

export const paginate = (prevPipeline: any[], options: IOptions) => {
  const dataPipeline = [...prevPipeline];

  if (options.searchBy) {
    const searchCriteria: any = {};
    options.searchBy.split(',').forEach((searchOption: string) => {
      const [field, searchString, searchOptionStr] = searchOption.split(':');
      if (searchString.trim().length > 0) {
        searchCriteria[field] = {
          $regex: searchString,
          $options: searchOptionStr,
        };
      }
    });
    if (Object.keys(searchCriteria).length > 0) {
      dataPipeline.push({ $match: searchCriteria });
    }
  }

  if (options.sortBy) {
    const sortingCriteria: any = {};
    options.sortBy.split(',').forEach((sortOption: string) => {
      const [key, order] = sortOption.split(':');
      sortingCriteria[key] = order === 'desc' ? -1 : 1;
    });
    dataPipeline.push({ $sort: sortingCriteria });
  } else {
    dataPipeline.push({ $sort: { createdAt: 1 } });
  }

  // Project
  if (options.projectBy) {
    const projectionCriteria: any = {};
    options.projectBy.split(',').forEach((projectOption) => {
      const [key, include] = projectOption.split(':');
      projectionCriteria[key] = include === 'hide' ? 0 : 1;
    });
    dataPipeline.push({ $project: projectionCriteria });
  } else {
    dataPipeline.push({ $project: { createdAt: 0, updatedAt: 0 } });
  }

  // Pagination
  const limit =
    options.limit && parseInt(options.limit.toString(), 10) > 0
      ? parseInt(options.limit.toString(), 10)
      : 10;
  const page =
    options.page && parseInt(options.page.toString(), 10) > 0
      ? parseInt(options.page.toString(), 10)
      : 1;
  const skip = (page - 1) * limit;
  dataPipeline.push({ $skip: skip }, { $limit: limit });

  return [
    {
      $facet: {
        metadata: [{ $count: 'totalCount' }],
        data: dataPipeline,
      },
    },
  ];
};```



I am expecting it should  give the matched record count when I queried and total elements count when I do not query it
node.js mongodb mongoose mongoose-schema
1个回答
0
投票

如果您需要使用totalMatchingCount而不是totalCount,则需要修改代码,例如:

 const skip = (page - 1) * limit;
// insert code here
const dataPipelineMatch =dataPipeLine;
dataPipeLineMatch.push({ $count: 'totalMatchCount' })
// insert code here
dataPipeline.push({ $skip: skip }, { $limit: limit });


 {
  $facet: {
    // modify this: metadata: [{ $count: 'totalCount' }] with:
    metadata: dataPipeLineMatch,
    //-----------------------
    data: dataPipeline,
  },
© www.soinside.com 2019 - 2024. All rights reserved.