如何用MongoDB $addFields拆分驼峰式及非标准分隔字段
解决方案:MongoDB 4.4.1 实现字段分隔符替换(驼峰/点/下划线转空格)
可以实现你的需求,利用MongoDB 4.4支持的$regexFindAll和$reduce组合处理驼峰式,再配合$replaceAll处理其他分隔符,全程通过$addFields完成。以下是完整的聚合管道:
db.collection.aggregate([ // 处理驼峰式:小写字母后接大写字母的位置插入空格 { $addFields: { businessNameBreakWords: { $reduce: { input: { $regexFindAll: { input: "$businessName", regex: /([a-z])([A-Z])/, options: "g" } }, initialValue: "$businessName", in: { $replaceOne: { input: "$$value", find: "$$this.match", replacement: "$1 $2" } } } } } }, // 替换点、下划线为空格 { $addFields: { businessNameBreakWords: { $replaceAll: { input: { $replaceAll: { input: "$businessNameBreakWords", find: ".", replacement: " " } }, find: "_", replacement: " " } } } }, // 移除@等非字母数字/空格的无关字符 { $addFields: { businessNameBreakWords: { $replaceAll: { input: "$businessNameBreakWords", find: /[^a-zA-Z0-9\s]/g, replacement: "" } } } }, // 合并连续空格为单个空格 { $addFields: { businessNameBreakWords: { $replaceAll: { input: "$businessNameBreakWords", find: /\s+/g, replacement: " " } } } } ])
步骤说明
驼峰式处理:
MongoDB 4.4的$replaceAll不支持正则捕获组引用(该功能在5.0+才上线),所以用$regexFindAll匹配所有小写+大写的驼峰片段,再通过$reduce遍历每个匹配结果,用$replaceOne逐个替换为带空格的格式。分隔符替换:
嵌套$replaceAll依次将点(.)、下划线(_)替换为空格。清理无关字符:
用正则/[^a-zA-Z0-9\s]/g匹配并移除所有非字母、数字、空格的字符(比如示例中的@),如果需要保留特定符号,可调整正则表达式。规整空格:
用/\s+/g匹配连续空格,替换为单个空格,避免出现冗余空格。
测试结果
输入文档:
{ "businessName": "Lisbon FunSushiBar" }, { "businessName": "Escape Room @york.dungeons.minster" }
输出生成字段:
Lisbon Fun Sushi Bar Escape Room york dungeons minster
内容的提问来源于stack exchange,提问作者joe92
相关产品推荐
相关产品推荐

