如何对MongoDB指定_id业务的内嵌customer数组对象做分页查询
MongoDB内嵌customers数组分页实现方案
完全可以实现针对指定业务文档内嵌customers数组的分页查询,每次返回10条数据,下面提供两种常用实现方案:
方案1:find查询配合$slice投影(性能最优,无需关联查询时优先使用)
直接在查询的投影阶段对数组做切片处理,分页参数规则:第N页需要跳过(N-1)*10条数据,示例代码如下:
// 示例查询第1页数据,修改page变量即可切换页码 const page = 1; const pageSize = 10; const skipCount = (page - 1) * pageSize; db.BusinessDetails.find( // 匹配指定_id的业务文档 { _id: ObjectId("6164bd360ab23b1482e1f10a") }, { // 返回业务名称字段,不需要可以删掉 name: 1, // 对customers数组切片:从skipCount位置开始取pageSize条 customers: { $slice: [skipCount, pageSize] } } )
该方案的优势是语法简单、查询性能高,缺点是返回的是原始DBRef对象,不会自动关联查询customer_details集合的完整客户信息。
方案2:聚合管道实现分页+关联查询完整客户信息
如果需要直接获取分页后的完整客户数据,可以通过聚合管道实现,示例代码如下:
const page = 1; const pageSize = 10; const skipCount = (page - 1) * pageSize; db.BusinessDetails.aggregate([ // 第一步:匹配指定_id的业务文档 { $match: { _id: ObjectId("6164bd360ab23b1482e1f10a") } }, // 第二步:展开customers数组为单条对象 { $unwind: "$customers" }, // 第三步:跳过前N条不需要的数据 { $skip: skipCount }, // 第四步:限制返回条数为每页大小 { $limit: pageSize }, // 第五步:关联customer_details集合查询完整客户信息 { $lookup: { from: "customer_details", localField: "customers.$id", foreignField: "_id", as: "customerDetail" } }, // 第六步:展开关联得到的客户信息数组 { $unwind: "$customerDetail" }, // 第七步:格式化返回结果结构 { $project: { businessName: "$name", customer: "$customerDetail" } } ])
注意事项
- 如果customers数组量级超过1000条,建议调整存储结构,不要将客户关联信息存在内嵌数组中,单独存储关联字段的分页查询性能会更高
- 无关联查询需求时优先使用方案1,性能远高于方案2
内容的提问来源于stack exchange,提问作者1977
相关产品推荐
相关产品推荐

