如何在MongoDB聚合管道中将对象数组转换为以ID为键的嵌套对象
解决方案
你只需要在$lookup阶段之后新增一个$set(MongoDB 4.2+支持,低版本可替换为$addFields)转换阶段,配合$map和$arrayToObject运算符即可实现需求:
完整聚合管道示例:
db.styles.aggregate([ // 你原有逻辑中的其他阶段,比如匹配筛选等 { $lookup: { from: "skus", localField: "id", foreignField: "styleId", as: "skus" } }, // 新增的skus结构转换阶段 { $set: { skus: { $arrayToObject: { $map: { input: "$skus", as: "sku", in: { // 以sku的id作为对象键,必须转成字符串格式 k: { $toString: "$$sku.id" }, v: { // 合并对象同时移除原有的id字段(匹配你给出的目标结构) $mergeObjects: [ "$$sku", { id: "$$REMOVE" } ] // 如果你不需要删除sku里的id字段,直接写v: "$$sku"即可 } } } } } } } ])
逻辑说明
$map遍历skus数组,将每个sku元素转换为符合$arrayToObject要求的k(键)、v(值)结构$arrayToObject将转换后的k-v数组直接拼接为目标对象结构$$REMOVE是MongoDB内置特殊值,赋值给某个字段时会直接删除该字段,用来去掉sku对象中已经作为键使用的id字段
内容的提问来源于stack exchange,提问作者h_a
相关产品推荐
相关产品推荐

