求助:MongoDB聚合中将嵌入对象数组转为嵌入对象的方法
MongoDB聚合:将数组转成以索引为键的对象
你可以在$lookup之后添加一个$addFields(或$project)阶段,结合$map和$arrayToObject实现转换,核心是先把数组元素转换成{k: 索引字符串, v: 原对象}的结构,再转成对象。
完整聚合示例
db.Styles.aggregate([ // 你的原有$lookup步骤 { $lookup: { from: "Skus", localField: "style_id", foreignField: "style_id", as: "skus" } }, // 添加这一步完成转换 { $addFields: { skus: { $arrayToObject: { $map: { input: "$skus", as: "skuItem", in: { k: { $toString: "$$index" }, // 把数组索引转成字符串作为键 v: "$$skuItem" // 原数组中的sku对象作为值 } } } } } }, // 输出到目标集合 { $out: "Styles" } ])
关键步骤说明
$map遍历数组:遍历skus数组的每个元素,同时通过$$index获取元素的数组索引,把索引用$toString转成字符串(MongoDB对象的键必须是字符串类型),然后生成{k: 索引字符串, v: sku对象}的结构。$arrayToObject转换为对象:把$map生成的数组直接转换成键值对对象,替换原来的skus数组字段。
如果之前用$arrayToObject失败,大概率是没先把数组元素处理成{k, v}格式,或者没把数字索引转成字符串,按上面的步骤调整就能解决。
内容的提问来源于stack exchange,提问作者chiElephant
相关产品推荐
相关产品推荐

