MongoDB中使用Lookup关联3个集合并实现嵌套结构
MongoDB 三个集合嵌套关联实现方案
没问题,我来帮你搞定MongoDB三个集合的嵌套关联需求!根据你给出的opera和orders集合示例,我先补充一个合理的第三层集合(比如订单项集合order_items),然后用嵌套的$lookup操作实现子集合嵌套到父对象的效果。
示例集合数据
首先确认三个集合的测试数据:
1. opera集合
db.opera.insert([ { "tlocal" : 1, "name" : "A" }, { "tlocal" : 2, "name" : "B"} ])
2. orders集合
db.orders.insert([ { "olocal" : 1, "name" : "ABC", "tlocal": 1}, { "olocal" : 2, "name" : "DEF", "tlocal": 1}, { "olocal" : 3, "name" : "LMN", "tlocal": 2}, { "olocal" : 4, "name" : "OPY", "tlocal": 2} ])
3. order_items集合(补充的第三层集合)
db.order_items.insert([ { "item_id": 1, "product": "Apple", "quantity": 2, "olocal": 1 }, { "item_id": 2, "product": "Banana", "quantity": 3, "olocal": 1 }, { "item_id": 3, "product": "Orange", "quantity": 1, "olocal": 2 }, { "item_id": 4, "product": "Grape", "quantity": 5, "olocal": 3 }, { "item_id": 5, "product": "Mango", "quantity": 2, "olocal": 4 } ])
嵌套关联聚合查询
我们需要通过**嵌套管道式$lookup**来实现三层数据的嵌套,具体查询语句如下:
db.opera.aggregate([ { // 第一层关联:将opera与orders通过tlocal字段关联 $lookup: { from: "orders", localField: "tlocal", foreignField: "tlocal", as: "orders", // 在orders的关联结果中,嵌套执行第二层关联 pipeline: [ { // 第二层关联:将每个订单与order_items通过olocal字段关联 $lookup: { from: "order_items", localField: "olocal", foreignField: "olocal", as: "items" } }, // 过滤订单文档中不需要的字段(可选) { $project: { _id: 0, olocal: 1, name: 1, items: 1 } } ] } }, // 过滤opera文档中不需要的字段(可选) { $project: { _id: 0, tlocal: 1, name: 1, orders: 1 } } ])
查询结果说明
执行上述聚合后,每个opera文档会包含嵌套的orders数组,每个订单又包含嵌套的items数组,最终结果如下:
[ { "tlocal": 1, "name": "A", "orders": [ { "olocal": 1, "name": "ABC", "items": [ { "item_id": 1, "product": "Apple", "quantity": 2, "olocal": 1 }, { "item_id": 2, "product": "Banana", "quantity": 3, "olocal": 1 } ] }, { "olocal": 2, "name": "DEF", "items": [ { "item_id": 3, "product": "Orange", "quantity": 1, "olocal": 2 } ] } ] }, { "tlocal": 2, "name": "B", "orders": [ { "olocal": 3, "name": "LMN", "items": [ { "item_id": 4, "product": "Grape", "quantity": 5, "olocal": 3 } ] }, { "olocal": 4, "name": "OPY", "items": [ { "item_id": 5, "product": "Mango", "quantity": 2, "olocal": 4 } ] } ] } ]
灵活调整说明
如果你的第三个集合不是order_items,只需要修改以下参数即可:
$lookup中的from值改为你的集合名localField和foreignField改为对应的关联字段as值改为你想要的嵌套字段名
内容的提问来源于stack exchange,提问作者Sunil Kumar
相关产品推荐
相关产品推荐

