MongoDB使用$facet实现聚合查询同时获取分页数据与总计数问题咨询
你可以直接按如下结构使用$facet改写聚合流程即可实现需求:
[ // 原有前置匹配、关联阶段保持不变 { $match: { $and: [{ batch: batchID }, { "$expr": { "$ne": ["$status", "deleted"] } }] } }, { $lookup: { from: 'users', let: { "id": "$worker" }, pipeline: [ { "$match": { "$expr": { "$eq": ["$_id", "$$id"] } } }, { "$project": { "firstName": 1, "lastName": 1, "candidateNo": 1, "emailAddress": 1, "worker.payrollProduct.agencyRef": 1 } }, ], as: 'worker' } }, { $match: candidatesQuery }, { $unwind: "$worker" }, // 新增$facet阶段拆分两个计算分支 { $facet: { // 分支1:输出分页后的业务数据 paginatedResults: [ { $skip: Number(params.offset) }, { $limit: Number(params.limit) } ], // 分支2:统计skip/limit执行前的总匹配条数 totalCount: [ { $count: 'count' } ] } }, // 可选优化:将总计数从数组转换为数字,方便后续直接调用 { $project: { paginatedResults: 1, total: { $arrayElemAt: ["$totalCount.count", 0] } } } ]
执行后返回的单条文档结构如下:
paginatedResults:和你原有聚合流程输出的分页数据结构完全一致total:所有符合匹配条件的记录总条数,无需额外计算
你之前未得到预期输出大概率是$facet放置位置错误,或是把前置匹配阶段拆分到了不同分支导致两边计算数据源不一致,上述写法将所有过滤、关联的公共前置阶段都放在$facet之前,保证两个分支的数据源完全统一,不会出现计数和分页数据匹配不上的问题。
内容的提问来源于stack exchange,提问作者Mohammed Ashraf
相关产品推荐
相关产品推荐

