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

如何用MongoDB聚合实现嵌套文档关联:清真寺、祈祷与订阅查询

解决MongoDB嵌套关联聚合查询问题

要实现单个清真寺文档关联其祈祷记录,且每个祈祷记录嵌套对应订阅数据的需求,你需要使用嵌套的$lookup聚合阶段,在关联祈祷集合的同时,为每条祈祷记录关联对应的订阅数据。以下是具体实现方案:

假设集合关联字段

  • mosques集合:用_id作为唯一标识
  • prayers集合:用mosqueId关联mosques._id,每条祈祷记录对应一个清真寺
  • subscriptions集合:用prayerId关联prayers._id,每条订阅记录对应一条祈祷

聚合查询语句

db.mosques.aggregate([
  // 筛选目标清真寺(替换为你要查询的清真寺ID或条件)
  {
    $match: { _id: ObjectId("目标清真寺ID") }
  },
  // 关联prayers集合,并在嵌套管道中关联subscriptions
  {
    $lookup: {
      from: "prayers",
      localField: "_id",
      foreignField: "mosqueId",
      as: "prayers",
      // 嵌套管道:为每条prayer关联对应的订阅数据
      pipeline: [
        {
          $lookup: {
            from: "subscriptions",
            localField: "_id",
            foreignField: "prayerId",
            as: "subscriptions"
          }
        }
      ]
    }
  }
])

关键说明

  • 外层$lookup负责将清真寺与对应的祈祷记录关联,生成prayers数组字段
  • 内层嵌套的pipeline参数中,再次使用$lookup,将每条祈祷记录与对应的订阅数据关联,最终每条prayer对象中会包含subscriptions数组(存储实际的订阅文档,而非字符串ID)
  • 如果你的关联字段不是上述命名,只需替换localField和foreignField为实际字段名即可

结果结构示例

{
  "_id": ObjectId("清真寺ID"),
  "name": "XX清真寺",
  // 其他清真寺字段...
  "prayers": [
    {
      "_id": ObjectId("祈祷ID"),
      "mosqueId": ObjectId("清真寺ID"),
      "time": "2024-05-20T12:00:00Z",
      // 其他祈祷字段...
      "subscriptions": [
        {
          "_id": ObjectId("订阅ID"),
          "prayerId": ObjectId("祈祷ID"),
          "userId": ObjectId("用户ID"),
          // 其他订阅字段...
        },
        // 更多订阅文档...
      ]
    },
    // 更多祈祷文档...
  ]
}

内容的提问来源于stack exchange,提问作者Bello Shehu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:38:12