MongoDB數(shù)據(jù)庫類replace替換字符串指定內(nèi)容
需求介紹
根據(jù)業(yè)務(wù)發(fā)展,現(xiàn)在需要對已經(jīng)存在的數(shù)據(jù)進(jìn)行處理,需要替換掉字段中指定字符串。
目的數(shù)據(jù)結(jié)構(gòu)為:
{
"_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.資產(chǎn)京東:無\r\n2.工作京東:現(xiàn)金\r\n3.貸款用途:\r\n4.需要金額和時間:\r\n5.推薦產(chǎn)品:\r\n6.報費京東:\r\n7.征信負(fù)債:\r\n8.不簽約原因:",
"_class" : "com.ysjr.base.domain.entity.ConversationInfo",
"followId" : NumberLong(1011500031014664),
"followType" : "FW001",
"result" : 1,
"intention" : "FI006",
"loseOrderReason" : [
"LR003"
],
"exec" : 1.0
}需要將跟進(jìn)數(shù)據(jù)的 message 字段中的 ”京東“ 字段替換為 ”其他“。
技術(shù)分析
分析發(fā)現(xiàn)在MYSQL等關(guān)系數(shù)據(jù)庫中有replace函數(shù),對字符串中的字符進(jìn)行替換。對于mongodb經(jīng)查詢官方文檔,發(fā)現(xiàn)也有相似的語法可以實現(xiàn)替換功能。如下所示:
1、$replaceOne 語法,但是每次只能更新字符串中發(fā)現(xiàn)的第一個目的串
2、javascript語法,在mongodb語法中寫js代碼來替換字符串,該種方式可以兼容多個目的串的情況,缺點是執(zhí)行效率慢
3、java代碼,java代碼直接獲取字符串進(jìn)行replaceAll() 函數(shù)替換 ,缺點是需要寫代碼并且執(zhí)行效率慢。
綜合以上實現(xiàn)方式,結(jié)合實際需求,我們本次數(shù)據(jù)處理選擇第二種方式 javascript 語法集合mongodb語法實現(xiàn)。雖然執(zhí)行效率慢,但是如果采用第一種我們需要執(zhí)行多次,第三種需要寫代碼。對于一個一次性處理數(shù)據(jù)的需求,采用簡單有效且僅損失部分性能我們是可以接受的。
技術(shù)積累
1、replaceOne 語法
db.getCollection('集合名稱')
.updateMany( {},//查詢條件
[{ $set: {"字段名稱": { $replaceOne: { input:"字段名稱", find:"需要替換的字符", replacement:"目的字符" }//替換語法
}} }] );2、javascript語法
db.getCollection('集合名稱')
.find({})//查詢條件
.forEach(//循環(huán)獲取目標(biāo)數(shù)據(jù)
function(item) {
var message = item['字符名稱'];
message = message.replace(/需要替換的字符/g, '目的字符');//目標(biāo)字符串替換,/g 標(biāo)識全局變量直接解決raplaceAll不支持方案,可以替換多個串
db.getCollection('集合名稱').updateOne({"_id":item['_id']},{$set:{"字段名稱":message,"exec":1}});//修改目標(biāo)字段,完成替換
});實戰(zhàn)演示
將所有跟進(jìn)數(shù)據(jù)的 message 字段中的 ”京東“ 字段替換為 ”其他“
我們直接在測試環(huán)境用第二種示范:
1、查詢滿足條件的數(shù)據(jù)
db.getCollection('conversation_info')
.find({"connectMode":"sys_follow","message":{$regex:"京東",$options:"$i"}})
如圖所示有在測試環(huán)境數(shù)據(jù)庫中有兩條,其中一條目標(biāo)字段中有多個目的字符串。
2、在mongodb語法中融入javascript語法并執(zhí)行
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}});
});
如圖所示執(zhí)行完成,提示成功但語法效率較低。
3、查看剛剛被修改的數(shù)據(jù)
db.getCollection('conversation_info')
.find({"connectMode":"sys_follow","message":{$regex:"其他",$options:"$i"}})
如圖所示,發(fā)現(xiàn)全部替換為目標(biāo)字符串,測試完成。
總結(jié):
MongoDB 類replace替換字符串指定內(nèi)容,replaceOne 語法僅能夠替換目標(biāo)字段中第一次出現(xiàn)的字符串,如果出現(xiàn)多次需要多次執(zhí)行 replaceOne 語法;如果用javascript 語法可以完全兼容多個目標(biāo)字符替換,極大的方便我們處理數(shù)據(jù)。
到此這篇關(guān)于MongoDB數(shù)據(jù)庫類replace替換字符串指定內(nèi)容的文章就介紹到這了,更多相關(guān)MongoDB替換字符串內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MongoDB創(chuàng)建與刪除數(shù)據(jù)庫
這篇文章介紹了MongoDB創(chuàng)建與刪除數(shù)據(jù)庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Mongodb 崩潰報錯 Too many open files的問題解析
這篇文章主要介紹了Mongodb 崩潰報錯 Too many open files的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
mongodb 數(shù)據(jù)庫操作詳解--創(chuàng)建,切換,刪除
mongodb是nosql里面最像關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫。單表操作,基本上可以和關(guān)系型數(shù)據(jù)庫差不多。mongodb比較易學(xué),易用,分幾期記錄一下,學(xué)習(xí)和使用mongodb過程。2014-07-07
記一次Mongodb中admin數(shù)據(jù)庫導(dǎo)致的事故
這篇文章主要給大家介紹了關(guān)于一次Mongodb中admin數(shù)據(jù)庫導(dǎo)致的事故的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03

