Mongoose查询实现field数组对象合并:基于reduce逻辑的实现方案
聚合实现数组对象合并方案
要实现和field.reduce((p,c)=>({...p,...c}),{})完全等价的逻辑,直接用MongoDB自带的聚合管道就能完成,不需要额外把数据拉到应用层做手动处理。
核心用到两个聚合操作符:
$reduce:和JS原生reduce逻辑完全一致,用来遍历数组做累计计算$mergeObjects:用来把多个对象做浅合并,后续对象的同名字段会覆盖前面对应的值,和JS展开运算符{...p, ...c}的合并规则一模一样
可直接复用的Mongoose聚合查询代码
// 替换成你实际的Mongoose模型 const result = await YourModel.aggregate([ // 根据实际查询条件匹配目标文档,这里示例匹配_id为a的文档 { $match: { _id: "a" } }, { $project: { // 保留原文档的_id字段 _id: 1, // 把field数组合并为单个对象 field: { $reduce: { // 遍历目标field数组 input: "$field", // 累计初始值为空对象,和JS reduce的初始值保持一致 initialValue: {}, // 每次循环把累计值和当前数组元素做合并 in: { $mergeObjects: ["$$value", "$$this"] } } } } } ])
输出效果
执行上述查询后,拿到的结果结构完全符合预期:
{ _id: "a", field: { _id: "ab", field2: "ab2", field1: "aa1" } }
注意:如果field数组内存在重复字段,后续遍历到的元素的字段值会覆盖前面的同名字段,和JS对象展开的合并规则无差异;如果field为空数组,最终输出的field字段会是空对象{},不会触发运行时错误。
内容的提问来源于stack exchange,提问作者mehdi parastar
相关产品推荐
相关产品推荐

