如何使用MongoDB的UpdateMany将BinData数组转为对象数组
解决MongoDB数组中BinData(UUID)转换为对象数组的问题
问题分析
你当前的更新查询存在两个核心问题:
Products.$仅能更新数组中首个匹配$type:5的元素,无法批量处理整个数组的所有元素_id: "$Products"未使用数组元素的正确引用语法,MongoDB会将其直接识别为字符串字面量,导致所有对象的_id都变成了"$Products"而非原UUID值
正确更新查询
使用MongoDB 4.2+支持的聚合管道式更新,通过$map遍历数组,将每个UUID元素转换为目标对象:
db.getCollection('Sanple_Product_Collection').updateMany( { "Products": { $type: 5 } }, // 筛选Products字段为BinData类型的文档 [ { $set: { Products: { $map: { input: "$Products", as: "uuid", in: { _id: "$$uuid", ProductName: null, ProductType: 1 } } } } } ] )
关键说明
$map会遍历Products数组的每一个元素,用$$uuid引用当前迭代的UUID值,确保每个对象的_id对应原数组中的真实UUID- 聚合管道更新允许在
$set中使用动态表达式生成新数组,而非静态赋值 - 条件
{ "Products": { $type: 5 } }中的5对应MongoDB的BinData类型,确保只处理符合要求的文档
执行结果验证
运行上述查询后,原文档的Products数组会被替换为预期格式:
Products : [ { _id: UUID("05d00bff-ce13-4230-961c-499419990032"), ProductName: null, ProductType: 1 }, { _id: UUID("7bf033b1-fc99-4b92-aac7-4a6c30b94913"), ProductName: null, ProductType: 1 }, { _id: UUID("d4185c4c-56ba-4580-b8e3-d17d43d3d7fa"), ProductName: null, ProductType: 1 } ]
内容的提问来源于stack exchange,提问作者Manak Kapoor
相关产品推荐
相关产品推荐

