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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:33