You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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> // 替换为每页显示的文档数
  }
])

关键说明:

  1. $unionWith核心作用:将col1筛选后的结果与col2筛选后的结果合并为扁平的结果集,每个文档都是两个集合中的独立条目,不会出现嵌套数组。
  2. 类型匹配注意:如果std_id是MongoDB的ObjectId类型,需用ObjectId()转换字符串参数;若为普通字符串则直接传值。
  3. 性能优化方案:针对数千条数据的查询效率,建议创建复合索引:
    • 给col1创建索引:db.col1.createIndex({_id: 1, school: 1})
    • 给col2创建索引:db.col2.createIndex({stud_health_id: 1, fk_school: 1})
  4. 扩展排序逻辑:如果需要对结果排序,可以在$skip阶段前添加$sort(比如按创建时间排序:{ $sort: { createTime: -1 } })。

内容的提问来源于stack exchange,提问作者Rajesh Barik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:15:38