MongoDB - 在字段中删除非数字字符

时间:2012-10-22 05:11:58

标签: regex mongodb mlab

我有一个电话号码字段,其中使用了各种各样的分隔符,例如:

932-555-1515 951.555.1255 (952)555-1414

我想浏览已存在的每个字段并删除非数字字符。那可能吗?无论它是以整数还是作为一串数字存储,我都不在乎。它仅用于显示目的。

谢谢

4 个答案:

答案 0 :(得分:19)

您必须在代码中迭代所有文档并使用正则表达式替换来清理字符串。

以下是您在mongo shell中为test集合执行此操作的方法,其中phone字段需要清理。

db.test.find().forEach(function(doc) {
  doc.phone = doc.phone.replace(/[^0-9]/g, ''); 
  db.test.save(doc);
});

答案 1 :(得分: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);
});

答案 2 :(得分:1)

Mongo 4.4开始,$function聚合运算符允许应用自定义javascript函数来实现MongoDB查询语言不支持的行为。

并结合Mongo 4.2中对db.collection.update()的改进,可以接受聚合管道,从而允许根据字段自身的值更新字段

我们可以用一种语言无法轻易允许和避免的低效率查找/ 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可用。

答案 3 :(得分:0)

在mongodb 4.2版中,您有regexFind project operator,可以与substr一起使用,而无需在客户端中遍历所有文档