MongoDB嵌套文档动态key下URI的IP替换方案咨询
解决方案
方法1:Mongo Shell 脚本(foreach 遍历处理)
适合小批量数据,逻辑直观易调试:
// 替换为你的ClearML集合名称 const collection = db.your_collection_name; // 遍历所有包含execution.artifacts的文档 collection.find({ "execution.artifacts": { $exists: true } }).forEach(doc => { const artifacts = doc.execution.artifacts; // 获取artifacts下所有动态生成的键 const artifactKeys = Object.keys(artifacts); // 逐个处理每个artifact的uri artifactKeys.forEach(key => { const oldUri = artifacts[key].uri; // 精准替换IP段,避免误匹配其他数字 const newUri = oldUri.replace(/http:\/\/100\.com/g, 'http://200.com'); artifacts[key].uri = newUri; }); // 保存修改后的文档 collection.updateOne( { _id: doc._id }, { $set: { "execution.artifacts": artifacts } } ); });
方法2:聚合管道批量更新(MongoDB 4.2+ 推荐)
针对大批量数据,直接在服务器端完成处理,效率更高:
// 替换为你的ClearML集合名称 db.your_collection_name.updateMany( { "execution.artifacts": { $exists: true } }, [ { $set: { "execution.artifacts": { $arrayToObject: { $map: { input: { $objectToArray: "$execution.artifacts" }, as: "artifact", in: { k: "$$artifact.k", v: { uri: { $replaceAll: { input: "$$artifact.v.uri", find: "http://100.com", replacement: "http://200.com" } } } } } } } } } ] );
核心逻辑说明
- 两种方法都先定位存在
execution.artifacts的目标文档 - 处理动态键时,通过
$objectToArray(聚合)或Object.keys()(Shell)将嵌套对象转为键值对数组,遍历处理后再转回对象结构 - 替换IP时使用精准匹配的字符串替换,确保只修改目标IP段
内容的提问来源于stack exchange,提问作者Clement Ruhm
相关产品推荐
相关产品推荐

