MongoDB多集合关联查询:返回非嵌套独立文档并支持分页
MongoDB聚合查询方案:合并两个集合的独立文档并支持分页
针对你的需求,用$unionWith操作符可以实现两个集合符合条件的文档独立返回(非嵌套结构),同时支持分页,具体聚合管道如下:
db.col1.aggregate([ // 筛选col1中符合条件的文档 { $match: { _id: ObjectId("<your_std_id>"), // 替换为请求的std_id,注意类型匹配(若为ObjectId需转类型) school: "<your_school_id>" // 替换为请求的school_id } }, // 合并col2中符合条件的文档 { $unionWith: { coll: "col2", pipeline: [ { $match: { stud_health_id: ObjectId("<your_std_id>"), // 匹配请求的std_id fk_school: "<your_school_id>" // 匹配请求的school_id } } ] } }, // 分页:跳过前N条数据 { $skip: (<page_number> - 1) * <page_size> // 替换为实际页码和每页数量,比如第2页每页10条则为(2-1)*10=10 }, // 分页:限制当前页返回数量 { $limit: <page_size> // 替换为每页显示的文档数 } ])
关键说明:
- $unionWith核心作用:将col1筛选后的结果与col2筛选后的结果合并为扁平的结果集,每个文档都是两个集合中的独立条目,不会出现嵌套数组。
- 类型匹配注意:如果
std_id是MongoDB的ObjectId类型,需用ObjectId()转换字符串参数;若为普通字符串则直接传值。 - 性能优化方案:针对数千条数据的查询效率,建议创建复合索引:
- 给col1创建索引:
db.col1.createIndex({_id: 1, school: 1}) - 给col2创建索引:
db.col2.createIndex({stud_health_id: 1, fk_school: 1})
- 给col1创建索引:
- 扩展排序逻辑:如果需要对结果排序,可以在
$skip阶段前添加$sort(比如按创建时间排序:{ $sort: { createTime: -1 } })。
内容的提问来源于stack exchange,提问作者Rajesh Barik
相关产品推荐
相关产品推荐

