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

Sta*_*wed 5 regex mongodb mlab

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

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

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

谢谢

Joh*_*yHK 19

您将不得不在代码中迭代所有文档并使用正则表达式替换来清理字符串.

以下是如何在mongo shell中为需要清理testphone字段的集合执行此操作.

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


Xav*_*hot 5

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

再加上db.collection.update()可以Mongo 4.2接受聚合管道的改进,允许根据字段自身的值更新字段,

我们可以以语言不容易允许的方式操作和更新字段,并避免低效的 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 }
Run Code Online (Sandbox Code Playgroud)

更新内容包括:

  • 匹配查询{ "x": { $regex: /[^0-9]/g } },过滤要更新的文档(在我们的例子中,任何包含我们感兴趣更新的字段中的非数字字符的文档)。

  • 更新聚合管道[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ](注意方括号表示使用聚合管道)。$set是一个新的聚合运算符和 的别名$addFields

$function需要 3 个参数:

  • body,这是要应用的函数,其参数是要修改的字符串。这里的功能只是用空字符替换与正则表达式匹配的字符。
  • argsbody,其中包含函数将其作为参数的记录中的字段。在我们的例子中,"$x".
  • lang,这是编写函数所用的语言body。仅js当前可用。