MongoDB嵌套聚合需求:根据指定User ID关联User与Book集合
MongoDB嵌套聚合实现用户关联书籍详情查询
集合结构示例
User集合文档
{ "_id": ObjectId("user123"), // User ID "name": "张三", "books": [ { "bookId": ObjectId("book001"), "read": true }, { "bookId": ObjectId("book002"), "read": false } ] }
Book集合文档
{ "_id": ObjectId("book001"), // Book ID "name": "MongoDB实战" }, { "_id": ObjectId("book002"), "name": "NoSQL入门指南" }
聚合实现思路
通过$match、$unwind、$lookup、$group等聚合操作组合,完成用户与书籍数据的关联和结构重组:
- 先定位目标用户,减少后续处理的数据量
- 拆分用户的书籍数组,为关联书籍详情做准备
- 关联Book集合获取完整书籍信息
- 整合书籍详情与用户的
read状态 - 重新聚合为符合要求的输出结构
完整聚合命令
假设要查询的User ID为ObjectId("user123"),执行以下聚合操作:
db.User.aggregate([ // 匹配指定用户 { $match: { _id: ObjectId("user123") } }, // 拆分用户的books数组 { $unwind: "$books" }, // 关联Book集合,获取书籍详情 { $lookup: { from: "Book", localField: "books.bookId", foreignField: "_id", as: "bookDetails" } }, // 将lookup返回的数组转为单个对象 { $unwind: "$bookDetails" }, // 整合read字段与书籍详情,整理需要的字段 { $addFields: { "bookDetails.read": "$books.read", "bookDetails.id": "$bookDetails._id" } }, // 提取需要的字段,为重组数组做准备 { $project: { userId: "$_id", bookItem: { id: "$bookDetails.id", name: "$bookDetails.name", read: "$bookDetails.read" } } }, // 重组为包含book_list数组的结构 { $group: { _id: "$userId", book_list: { $push: "$bookItem" } } }, // 调整输出字段名称,移除默认_id { $project: { userId: "$_id", book_list: 1, _id: 0 } } ])
输出结果示例
{ "userId": ObjectId("user123"), "book_list": [ { "id": ObjectId("book001"), "name": "MongoDB实战", "read": true }, { "id": ObjectId("book002"), "name": "NoSQL入门指南", "read": false } ] }
内容的提问来源于stack exchange,提问作者Asif
相关产品推荐
相关产品推荐

