a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 數(shù)據(jù)庫(kù) > MongoDB > 正文

MongoDB中數(shù)據(jù)的替換方法實(shí)現(xiàn)類Replace()函數(shù)功能詳解

2020-10-29 18:40:44
字體:
供稿:網(wǎng)友

近日接到一個(gè)開發(fā)需求,因業(yè)務(wù)調(diào)整,需要DBA協(xié)助,將MongoDB數(shù)據(jù)庫(kù)中某集合的進(jìn)行替換。例如我們需要將集合A中B字段中,有關(guān)《美好》的字符替換為 《非常美好》。個(gè)人感覺這個(gè)需求如果是在SQL Server 或MySQL 數(shù)據(jù)庫(kù)上處理是小菜一碟,如果是針對(duì)MongoDB數(shù)據(jù),可能要費(fèi)神了。

1.常見關(guān)系數(shù)據(jù)數(shù)據(jù)庫(kù)中的替換函數(shù)

在SQL Server數(shù)據(jù)庫(kù)中,我們用Replace函數(shù)來實(shí)現(xiàn)字符的替換。

語法

REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )

參數(shù)

''string_replace1''

待搜索的字符串表達(dá)式。string_replace1 可以是字符數(shù)據(jù)或二進(jìn)制數(shù)據(jù)。

''string_replace2''

待查找的字符串表達(dá)式。string_replace2 可以是字符數(shù)據(jù)或二進(jìn)制數(shù)據(jù)。

''string_replace3''

替換用的字符串表達(dá)式。string_replace3 可以是字符數(shù)據(jù)或二進(jìn)制數(shù)據(jù)。

 例如將 字符串 SQL Server 數(shù)據(jù)庫(kù) 中的  SQL Server 替換為 MongoDB。

實(shí)現(xiàn)語句如下:

在MySQL數(shù)據(jù)庫(kù)中語法類似。

2.在MongoDB中實(shí)現(xiàn)替換方法

很可惜,到目前為止還沒有找到類似SQL Server的替換函數(shù),那么我們?cè)趺慈?shí)現(xiàn)文檔中的數(shù)據(jù)替換呢?特別是集合中的文檔數(shù)量比較大時(shí)。

假設(shè)現(xiàn)在有用戶信息文檔,如下。注意其中有聯(lián)系地址。

{  "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),  "username" : "hanmeimei",  "email" : "123456@126.com",  "tel" : 7891233,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市鄄城縣曹集鎮(zhèn)",    "stree" : "武狀元街道28號(hào)"  }},/* 2 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87df"),  "username" : "Lily",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : [    {      "provice" : "河南省",      "city" : "鄭州市登封縣李集鎮(zhèn)",      "stree" : "少林街道28號(hào)"    }  ]},/* 3 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87de"),  "username" : "Lily",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市定陶縣曹集鎮(zhèn)",    "stree" : "武狀元街道28號(hào)"  }},/* 4 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),  "username" : "jack",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市定陶縣",    "stree" : "武狀元街道28號(hào)"  }}

現(xiàn)在因?yàn)樾姓^(qū)域劃分,將 菏澤市定陶縣劃為定陶縣區(qū)。那么怎么進(jìn)行批量修改呢? MongoDB中沒有Replace。

Update,也不好寫代碼。

最終.......我們還是找到了一個(gè)方法。

大家是先看看執(zhí)行的代碼及實(shí)現(xiàn)的結(jié)果。

 db.user.find({'addresses.city':{'$regex': /菏澤市定陶縣/ }}).forEach(   function(item) {    var tmp = String(item.addresses.city)    tmp = tmp.replace('菏澤市定陶縣','菏澤市定陶縣區(qū)')    if (tmp == null){      print(item.addresses.city)      }     item.addresses.city = tmp ;         db.user.save(item);  }  );

  

 

執(zhí)行后,再次查看數(shù)據(jù),結(jié)果如下:

/* 1 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),  "username" : "hanmeimei",  "email" : "123456@126.com",  "tel" : 7891233,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市鄄城縣曹集鎮(zhèn)",    "stree" : "武狀元街道28號(hào)"  }},/* 2 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87df"),  "username" : "Lily",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : [    {      "provice" : "河南省",      "city" : "鄭州市登封縣李集鎮(zhèn)",      "stree" : "少林街道28號(hào)"    }  ]},/* 3 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87de"),  "username" : "Lily",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市定陶縣區(qū)曹集鎮(zhèn)",    "stree" : "武狀元街道28號(hào)"  }},/* 4 createdAt:2019/2/28 下午9:45:28*/{  "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),  "username" : "jack",  "email" : "123456@126.com",  "tel" : 123455,  "addresses" : {    "provice" : "山東省",    "city" : "菏澤市定陶縣區(qū)",    "stree" : "武狀元街道28號(hào)"  }}

集合文檔中addresses.city中的'菏澤市定陶縣' 全部被 '菏澤市定陶縣區(qū)' 替換,符合設(shè)計(jì)要求。

3.知識(shí)補(bǔ)充與回顧

(1)作為一個(gè)數(shù)據(jù)庫(kù),MongoDB有一個(gè)很大的優(yōu)勢(shì)―它使用js管理數(shù)據(jù)庫(kù),所以也能夠使用js腳本進(jìn)行復(fù)雜的管理。MongoDB自帶JavaScript shell,可在shell中使用命令行與MongoDB進(jìn)行交互。shell是一個(gè)功能完備的JavaScript解釋器,可運(yùn)行任意JavaScript程序。

mongodb 的shell是javascript實(shí)現(xiàn)的,如果直接使用js實(shí)現(xiàn)相應(yīng)的功能則顯得很直觀和簡(jiǎn)便。比如我們對(duì)一些數(shù)據(jù)進(jìn)行 統(tǒng)計(jì)計(jì)算,除了使用mapreduce和aggreate框架之外,直接使用js也是很好的選擇。還有一些批處理,數(shù)據(jù)同步都可以使用js

例如將集合中所有的文檔,打印出來--  db.collectionname.find().forEach(printjson)。

注意:在上面演示的MongoDB替換字符的腳本,都在mongodb shell 和 nosqlbooster 工具里面驗(yàn)證過,沒有問題。但是相同的代碼在mongodb shell中要注意格式要求,最好要符合Javascript 格式要求,否則,可能報(bào)錯(cuò),如:E QUERY    [thread1] SyntaxError: missing ; before statement @(shell):1:138

(2)forEach:MongoDB數(shù)據(jù)庫(kù)使用游標(biāo)返回find的執(zhí)行結(jié)果。客戶端對(duì)游標(biāo)的實(shí)現(xiàn)通常能夠?qū)ψ罱K結(jié)果進(jìn)行有效的控制。可以限制結(jié)果的數(shù)量,略過部分結(jié)果,根據(jù)任意鍵按任意順序的組合對(duì)結(jié)果進(jìn)行各種排序,或者是執(zhí)行其他一些強(qiáng)大的操作。游標(biāo)有一個(gè)重要的迭代函數(shù)---cursor.forEach(回調(diào)函數(shù)),允許我們自定義回調(diào)函數(shù)來逐個(gè)處理每個(gè)單元.

(3)$regex :正則表達(dá)式是使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。MongoDB 使用 $regex 操作符來設(shè)置匹配字符串的正則表達(dá)式。

更多關(guān)于MongoDB中數(shù)據(jù)的替換方法實(shí)現(xiàn)的方法請(qǐng)查看下面的相關(guān)鏈接

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 狠狠躁夜夜躁人人爽天天高潮 | 美日韩一区二区 | 日日夜夜精品免费视频 | 91精品国产欧美一区二区 | 中文字幕在线看 | 日本欧美在线观看 | 9 1在线观看 | 在线h观看| 亚洲精品一区二区在线观看 | 第一色站 | 久久精品这里有 | 视频在线一区 | 精品一区二区在线免费观看 | 久久久精品999 | 久久久网| 国产羞羞视频 | 99爱视频| 欧美h视频 | 精品久久久网站 | 欧美日韩综合一区 | 日本不卡一区二区三区在线观看 | 色婷婷亚洲 | av黄色一级| 操操日 | 精品一区不卡 | 日韩视频免费观看 | 欧美视频1区 | 污网址 | 在线草 | 欧美日韩国产精品 | 亚洲视频中文字幕 | 日韩在线成人 | a视频在线观看免费 | 欧美精品久久久久久精华液 | 久久兔费看a级 | 国产羞羞视频在线观看 | 色吊丝2288sds中文字幕 | 国产欧美日韩综合精品一 | 精品国产aⅴ一区二区 | 天天看天天摸天天操 | www.狠狠干 |