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

MongoDB聚合问题:从ObjectId子数组获取关联书籍详情及报错解决

解决MongoDB聚合中关联书籍详情的问题

你的代码错误原因

你在$map的in字段中使用了$match和拼写错误的$paroject(正确写法是$project),这两个是聚合管道阶段操作符,只能在聚合的顶级阶段使用,不能在表达式上下文(比如$map内部)调用,因此抛出了Unrecognized error: '$match'的错误。

正确解决方案

方法一:直接通过book_ids关联并投影(推荐)

利用author集合中的book_ids字段直接关联book集合的_id,同时在$lookup的管道内完成字段筛选,效率更高:

db.author.aggregate([
  {
    $match: {
      _id: ObjectId("63c242130b17d5516e0cb499")
    }
  },
  {
    $lookup: {
      from: "book",
      let: { bookIds: "$book_ids" },
      pipeline: [
        {
          $match: {
            $expr: { $in: ["$_id", "$$bookIds"] }
          }
        },
        {
          $project: {
            _id: 1,
            book_name: 1
          }
        }
      ],
      as: "book_info"
    }
  }
])

方法二:基于原lookup结果构造目标字段

如果仍想通过author_id关联,可在$lookup后用$map直接构造需要的字段对象,而非使用阶段操作符:

db.author.aggregate([
  {
    $match: {
      _id: ObjectId("63c242130b17d5516e0cb499")
    }
  },
  {
    $lookup: {
      from: 'book',
      localField: '_id',
      foreignField: 'author_id',
      as: 'book_details'
    }
  },
  {
    $addFields: {
      book_info: {
        $map: {
          input: '$book_details',
          as: 'el',
          in: {
            _id: '$$el._id',
            book_name: '$$el.book_name'
          }
        }
      }
    }
  },
  // 可选:移除不需要的book_details字段
  {
    $project: {
      book_details: 0
    }
  }
])

两种方法都能得到你期望的输出结果,其中方法一避免了获取不必要的书籍字段,性能更优。

内容的提问来源于stack exchange,提问作者Sushant Rad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:35:25