MongoDB投影操作如何将文档数组转为id为键的键值对象
MongoDB 聚合转换实现方法
$arrayToObject 操作符的强制要求是:传入的数组每个元素必须包含k(对应输出对象的键名)、v(对应键的值)两个字段,用法错误基本都是缺少了这层结构映射。
聚合管道直接输出目标结构(推荐)
在你原有聚合逻辑的末尾追加两个阶段即可,Node.js驱动下的完整写法示例:
const pipeline = [ // 此处替换为你原有的匹配、查询、分组等聚合阶段,输出结果为你贴出的{id, amounts}结构文档流 // 阶段1:将所有结果收集为数组,同时映射为arrayToObject要求的k-v结构 { $group: { _id: null, res: { $push: { k: "$id", v: "$amounts" } } } }, // 阶段2:将k-v数组转换为目标对象,作为最终结果输出 { $replaceRoot: { newRoot: { $arrayToObject: "$res" } } } ] // 调用查询 const result = await yourCollection.aggregate(pipeline).toArray() // result[0] 即为你需要的结构:{"0x3c93": [ 10, 20, 30 ], "0xee10": [ 0, 0, 100 ]}
Node.js侧直接转换(无需修改聚合逻辑)
如果你已经拿到了查询返回的原始数组,不需要调整数据库查询逻辑,直接用JS原生方法转换即可:
// rawResult 为MongoDB返回的原始数组:[{ amounts: [ 10, 20, 30 ], id: "0x3c93" }, ...] const targetObj = Object.fromEntries(rawResult.map(item => [item.id, item.amounts]))
注意:
$arrayToObject仅支持MongoDB 3.4.4及以上版本,低版本直接使用JS侧转换方案即可。
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

