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

