【问题标题】:MongoDB - strip non numeric characters in fieldMongoDB - 去除字段中的非数字字符
【发布时间】:2012-10-11 21:34:40
【问题描述】:

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

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

我想遍历每个已经存在的字段并删除非数字字符。

这可能吗?

无论它是存储为整数还是一串数字,我都不在乎。它只会用于显示目的。

【问题讨论】:

    标签: regex mongodb mlab


    【解决方案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 一起使用,而无需遍历客户端中的所有文档

          【讨论】:

            猜你喜欢
            • 2011-04-28
            • 2018-10-21
            • 1970-01-01
            • 1970-01-01
            • 2016-02-27
            • 1970-01-01
            相关资源
            最近更新 更多