MongoDB:如何通过$lookup为玩家文档生成物品名称数组?
MongoDB聚合实现玩家物品名称数组生成
可以通过以下聚合管道实现需求,核心利用$lookup关联物品集合,再提取对应名称数组:
db.players.aggregate([ { $lookup: { from: "items", localField: "items", foreignField: "_id", as: "itemDetails" } }, { $project: { username: 1, items: 1, itemNames: { $map: { input: "$itemDetails", as: "item", in: "$$item.name" } } } } ])
步骤说明:
- $lookup阶段:将
players集合中玩家的items物品ID数组,与items集合的_id字段关联,把匹配到的物品详情存入临时字段itemDetails。 - $project阶段:保留原文档的
username和items字段,通过$map遍历itemDetails数组,提取每个物品的name值,生成目标字段itemNames。
如果需要严格保证itemNames的顺序和原items数组完全一致($lookup返回的结果顺序可能不匹配原数组),可以使用以下管道:
db.players.aggregate([ { $unwind: "$items" }, { $lookup: { from: "items", localField: "items", foreignField: "_id", as: "itemDetail" } }, { $unwind: "$itemDetail" }, { $group: { _id: "$_id", username: { $first: "$username" }, items: { $push: "$items" }, itemNames: { $push: "$itemDetail.name" } } } ])
顺序匹配方案说明:
- $unwind阶段:将玩家的
items数组拆分为单条文档,每个文档对应一个物品ID。 - $lookup阶段:关联
items集合获取单个物品的详情。 - $unwind阶段:展开
itemDetail数组($lookup返回结果始终为数组格式)。 - $group阶段:按玩家ID重新分组,将拆分的物品ID和名称分别组装回数组,确保顺序和原
items数组完全一致。
内容的提问来源于stack exchange,提问作者Akash Chavda
相关产品推荐
相关产品推荐

