如何用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
相关产品推荐
相关产品推荐

