MongoDB - 去除字段中的非数字字符
Posted
技术标签:
【中文标题】MongoDB - 去除字段中的非数字字符【英文标题】:MongoDB - strip non numeric characters in field 【发布时间】:2012-10-11 21:34:40 【问题描述】:我有一个电话号码字段,其中使用了各种随机分隔符,例如:
932-555-1515
951.555.1255
(952) 555-1414
我想遍历每个已经存在的字段并删除非数字字符。
这可能吗?
无论它是存储为整数还是一串数字,我都不在乎。它只会用于显示目的。
【问题讨论】:
【参考方案1】:您必须在代码中遍历所有文档并使用正则表达式替换来清理字符串。
这是在 mongo shell 中为 test
集合执行此操作的方法,其中 phone
字段需要清理。
db.test.find().forEach(function(doc)
doc.phone = doc.phone.replace(/[^0-9]/g, '');
db.test.save(doc);
);
【讨论】:
【参考方案2】:基于@JohnnyHK 之前的示例,我还在查找查询中添加了正则表达式:
/*
MongoDB: Find by regular expression and run regex replace on results
*/
db.test.find("url": $regex: 'http:\/\/' ).forEach(function(doc)
doc.url = doc.url.replace(/http:\/\/www\.url\.com/g, 'http://another.url.com');
db.test.save(doc);
);
【讨论】:
【参考方案3】:从Mongo 4.4
开始,$function
聚合运算符允许应用自定义 javascript 函数来实现 MongoDB 查询语言不支持的行为。
再加上对Mongo 4.2
中的db.collection.update()
的改进,可以接受聚合管道,从而允许根据自己的值更新字段,
我们可以以语言不容易允许的方式操作和更新字段,并避免低效的 find/foreach 模式:
// "x" : "932-555-1515", "y" : 3
// "x" : "951.555.1255", "y" : 7
// "x" : "(952) 555-1414", "y" : 6
db.collection.updateMany(
"x": $regex: /[^0-9]/g ,
[ $set:
"x":
$function:
body: function(x) return x.replace(/[^0-9]/g, ''); ,
args: ["$x"],
lang: "js"
])
// "x" : "9325551515", "y" : 3
// "x" : "9515551255", "y" : 7
// "x" : "9525551414", "y" : 6
更新包括:
匹配查询 "x": $regex: /[^0-9]/g
,过滤要更新的文档(在我们的例子中,任何文档在我们有兴趣更新的字段中包含非数字字符)。
更新聚合管道[ $set: active: $eq: [ "$a", "Hello" ] ]
(注意方括号表示使用聚合管道)。 $set
是一个新的聚合运算符,是$addFields
的别名。
$function
接受 3 个参数:
body
,即要应用的函数,其参数是要修改的字符串。这里的功能只是用空字符替换匹配正则表达式的字符。
args
,其中包含 body
函数作为参数的记录中的字段。在我们的例子中,"$x"
。
lang
,这是编写 body
函数的语言。目前只有 js
可用。
【讨论】:
【参考方案4】:在 mongodb 4.2 版中,regexFind project operator 可以在聚合中与 substr 一起使用,而无需遍历客户端中的所有文档
【讨论】:
以上是关于MongoDB - 去除字段中的非数字字符的主要内容,如果未能解决你的问题,请参考以下文章
Python给定一个字符串,去除字符串的非字母字符然后将每个字符串的首字母大写?