如何在MongoDB关联集合后使用$project指定保留字段?
解决方法
你之前的问题出在:$project里直接写branch_id:1是在根文档层面找这个字段,但branch_id是嵌套在book_copies数组的每个元素里的,所以这么写根本找不到,反而会因为没指定book_copies:1导致这个数组被排除。
下面给两种可行的方案:
方案1:用带Pipeline的$lookup(推荐,更高效)
直接在关联查询阶段就只获取需要的字段,避免后续再过滤,性能更好:
db.books.aggregate([ { $lookup: { from: 'book_copies', let: { book_isbn: "$ISBN10" }, pipeline: [ { $match: { $expr: { $eq: ["$book_id", "$$book_isbn"] } } }, { $project: { _id: 0, branch_id: 1, no_of_copies: 1 } } // 只保留需要的字段,排除默认的_id ], as: 'book_copies' } }, { $project: { ISBN10: 1, ISBN13: 1, Title: 1, Cover: 1, Publisher: 1, Pages: 1, Authors_arr: 1, book_copies: 1 // 保留处理后的关联数组 } } ]);
方案2:在$project中用$map重构数组
如果已经完成了普通$lookup,也可以在$project阶段通过$map遍历book_copies数组,只保留每个元素里的指定字段:
db.books.aggregate([ { $lookup: { from: 'book_copies', localField: 'ISBN10', foreignField: 'book_id', as: 'book_copies' } }, { $project: { ISBN10: 1, ISBN13: 1, Title: 1, Cover: 1, Publisher: 1, Pages: 1, Authors_arr: 1, book_copies: { $map: { input: "$book_copies", as: "copy", in: { branch_id: "$$copy.branch_id", no_of_copies: "$$copy.no_of_copies" } } } } } ]);
两种方案都能实现你的需求,推荐第一种,因为它在关联时就过滤掉不需要的数据,减少了数据传输和处理的开销。
内容的提问来源于stack exchange,提问作者gggggggggzaozi
相关产品推荐
相关产品推荐

