MongoDB数据库类replace替换字符串指定内容

bangongJIAO1@c 发布于 2025-11-30 阅读(4)
目录
  • 需求介绍
  • 技术分析
  • 技术积累
    • 1、replaceOne 语法
    • 2、javascript语法
  • 实战演示
    • 1、查询满足条件的数据
    • 2、在mongodb语法中融入javascript语法并执行
    • 3、查看刚刚被修改的数据
  • 总结:

    需求介绍

    根据业务发展,现在需要对已经存在的数据进行处理,需要替换掉字段中指定字符串。

    目的数据结构为:

    {
    "_id" : ObjectId("6166fa27de458266eecdb288"),
    "receiverId" : NumberLong(1011500013127618),
    "senderId" : NumberLong(1011500000008954),
    "companyId" : 1.0,
    "status" : 1.0,
    "dataSources" : 4.0,
    "senderType" : "employee",
    "receiverType" : "customer",
    "mediaType" : "text",
    "connectMode" : "sys_follow",
    "messageType" : "conversation",
    "businessId" : NumberLong(1011500013127618),
    "createTime" : ISODate("2020-01-21T04:01:23.000Z"),
    "updateTime" : ISODate("2020-01-21T04:01:23.000Z"),
    "message" : "1.资产京东:无\r\n2.工作京东:现金\r\n3.贷款用途:\r\n4.需要金额和时间:\r\n5.推荐产品:\r\n6.报费京东:\r\n7.征信负债:\r\n8.不签约原因:",
    "_class" : "com.ysjr.base.domain.entity.ConversationInfo",
    "followId" : NumberLong(1011500031014664),
    "followType" : "FW001",
    "result" : 1,
    "intention" : "FI006",
    "loseOrderReason" : [
    "LR003"
    ],
    "exec" : 1.0
    }

    需要将跟进数据的 message 字段中的 ”京东“ 字段替换为 ”其他“。

    技术分析

    分析发现在MYSQL等关系数据库中有replace函数,对字符串中的字符进行替换。对于mongodb经查询官方文档,发现也有相似的语法可以实现替换功能。如下所示:

    1、$replaceOne 语法,但是每次只能更新字符串中发现的第一个目的串

    2、javascript语法,在mongodb语法中写js代码来替换字符串,该种方式可以兼容多个目的串的情况,缺点是执行效率慢

    3、java代码,java代码直接获取字符串进行replaceAll() 函数替换 ,缺点是需要写代码并且执行效率慢。

    综合以上实现方式,结合实际需求,我们本次数据处理选择第二种方式 javascript 语法集合mongodb语法实现。虽然执行效率慢,但是如果采用第一种我们需要执行多次,第三种需要写代码。对于一个一次性处理数据的需求,采用简单有效且仅损失部分性能我们是可以接受的。

    技术积累

    1、replaceOne 语法

    db.getCollection('集合名称')
    .updateMany( {},//查询条件 
    [{ $set: {"字段名称": { $replaceOne: { input:"字段名称", find:"需要替换的字符", replacement:"目的字符" }//替换语法
     }} }] );

    2、javascript语法

    db.getCollection('集合名称') 
    .find({})//查询条件 
    .forEach(//循环获取目标数据 
    function(item) { 
    var message = item['字符名称']; 
    message = message.replace(/需要替换的字符/g, '目的字符');//目标字符串替换,/g 标识全局变量直接解决raplaceAll不支持方案,可以替换多个串 
    db.getCollection('集合名称').updateOne({"_id":item['_id']},{$set:{"字段名称":message,"exec":1}});//修改目标字段,完成替换 
    });

    实战演示

    将所有跟进数据的 message 字段中的 ”京东“ 字段替换为 ”其他“

    我们直接在测试环境用第二种示范:

    1、查询满足条件的数据

    db.getCollection('conversation_info') 
    .find({"connectMode":"sys_follow","message":{$regex:"京东",$options:"$i"}})

    MongoDB数据库类replace替换字符串指定内容

     如图所示有在测试环境数据库中有两条,其中一条目标字段中有多个目的字符串。

    2、在mongodb语法中融入javascript语法并执行

    db.getCollection('conversation_info') 
    .find({"connectMode":"sys_follow","message":{$regex:"京东",$options:"$i"}}) 
    .forEach( function(item) { 
    var message = item['message']; 
    message = message.replace(/京东/g, '其他'); db.getCollection('conversation_info').updateOne({"_id":item['_id']},{$set:{"message":message,"exec":1}}); 
    });

    MongoDB数据库类replace替换字符串指定内容

     如图所示执行完成,提示成功但语法效率较低。

    3、查看刚刚被修改的数据

    db.getCollection('conversation_info') 
    .find({"connectMode":"sys_follow","message":{$regex:"其他",$options:"$i"}})

    MongoDB数据库类replace替换字符串指定内容

     如图所示,发现全部替换为目标字符串,测试完成。

    总结:

    MongoDB 类replace替换字符串指定内容,replaceOne 语法仅能够替换目标字段中第一次出现的字符串,如果出现多次需要多次执行 replaceOne 语法;如果用javascript 语法可以完全兼容多个目标字符替换,极大的方便我们处理数据。