MongoDB 中數據的替換方法實現 --類Replace()函數功能

来源:https://www.cnblogs.com/xuliuzai/archive/2019/03/01/10453651.html
-Advertisement-
Play Games

關鍵字: MongoDB,Replace,forEach 近日接到一個開發需求,因業務調整,需要DBA協助,將MongoDB資料庫中某集合的進行替換。例如我們需要將集合A中B欄位中,有關《美好》的字元替換為 《非常美好》。個人感覺這個需求如果是在SQL Server 或MySQL 資料庫上處理是小菜 ...


關鍵字: MongoDB,Replace,forEach

近日接到一個開發需求,因業務調整,需要DBA協助,將MongoDB資料庫中某集合的進行替換。例如我們需要將集合A中B欄位中,有關《美好》的字元替換為 《非常美好》。個人感覺這個需求如果是在SQL Server 或MySQL 資料庫上處理是小菜一碟,如果是針對MongoDB數據,可能要費神了。

1.常見關係數據資料庫中的替換函數

在SQL Server資料庫中,我們用Replace函數來實現字元的替換。

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

參數
''string_replace1''

待搜索的字元串表達式。string_replace1 可以是字元數據或二進位數據。

''string_replace2''

待查找的字元串表達式。string_replace2 可以是字元數據或二進位數據。

''string_replace3''

替換用的字元串表達式。string_replace3 可以是字元數據或二進位數據。

 例如將 字元串 SQL Server 資料庫 中的  SQL Server 替換為 MongoDB。

實現語句如下:

在MySQL資料庫中語法類似。

2 在MongoDB中實現替換方法

很可惜,到目前為止還沒有找到類似SQL Server的替換函數,那麼我們怎麼去實現文檔中的數據替換呢?特別是集合中的文檔數量比較大時。

假設現在有用戶信息文檔,如下。註意其中有聯繫地址。

{
    "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),
    "username" : "hanmeimei",
    "email" : "123456@126.com",
    "tel" : 7891233,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市鄄城縣曹集鎮",
        "stree" : "武狀元街道28號"
    }
},

/* 2 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87df"),
    "username" : "Lily",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : [
        {
            "provice" : "河南省",
            "city" : "鄭州市登封縣李集鎮",
            "stree" : "少林街道28號"
        }
    ]
},

/* 3 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87de"),
    "username" : "Lily",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市定陶縣曹集鎮",
        "stree" : "武狀元街道28號"
    }
},

/* 4 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),
    "username" : "jack",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市定陶縣",
        "stree" : "武狀元街道28號"
    }
}

現在因為行政區域劃分,將 菏澤市定陶縣劃為定陶縣區。那麼怎麼進行批量修改呢? MongoDB中沒有Replace。

Update,也不好寫代碼。

最終.......我們還是找到了一個方法。

大家是先看看執行的代碼及實現的結果。

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

 

執行後,再次查看數據,結果如下:

/* 1 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),
    "username" : "hanmeimei",
    "email" : "123456@126.com",
    "tel" : 7891233,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市鄄城縣曹集鎮",
        "stree" : "武狀元街道28號"
    }
},

/* 2 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87df"),
    "username" : "Lily",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : [
        {
            "provice" : "河南省",
            "city" : "鄭州市登封縣李集鎮",
            "stree" : "少林街道28號"
        }
    ]
},

/* 3 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87de"),
    "username" : "Lily",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市定陶縣區曹集鎮",
        "stree" : "武狀元街道28號"
    }
},

/* 4 createdAt:2019/2/28 下午9:45:28*/
{
    "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),
    "username" : "jack",
    "email" : "123456@126.com",
    "tel" : 123455,
    "addresses" : {
        "provice" : "山東省",
        "city" : "菏澤市定陶縣區",
        "stree" : "武狀元街道28號"
    }
}

 集合文檔中addresses.city中的’菏澤市定陶縣' 全部被 '菏澤市定陶縣區’ 替換,符合設計要求。

3.知識補充與回顧

(1)作為一個資料庫,MongoDB有一個很大的優勢—它使用js管理資料庫,所以也能夠使用js腳本進行複雜的管理。MongoDB自帶JavaScript shell,可在shell中使用命令行與MongoDB進行交互。shell是一個功能完備的JavaScript解釋器,可運行任意JavaScript程式。

mongodb 的shell是javascript實現的,如果直接使用js實現相應的功能則顯得很直觀和簡便。比如我們對一些數據進行 統計計算,除了使用mapreduce和aggreate框架之外,直接使用js也是很好的選擇。還有一些批處理,數據同步都可以使用js

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

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

(2)forEach:MongoDB資料庫使用游標返回find的執行結果。客戶端對游標的實現通常能夠對最終結果進行有效的控制。可以限制結果的數量,略過部分結果,根據任意鍵按任意順序的組合對結果進行各種排序,或者是執行其他一些強大的操作。游標有一個重要的迭代函數---cursor.forEach(回調函數),允許我們自定義回調函數來逐個處理每個單元.

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

(4)集合的save用法:根據主鍵_id 判斷,要保存的數據是否在集合中,在的話,則替換;不存在的話,在直接insert。

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

 本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相信很多人在mysql中看到了where條件中使用到了or就會以為這樣是不會走索引的,通常會使用union all或者in 來進行優化,事實並不是想象的這樣具體問題具體分析。 下麵我們來看看 首先我們用sysbench生成兩個100w行的表 表結構如下 1.首先我們使用同一列帶索引欄位的進行查詢。 ...
  • 領導毛主席在《在魯迅藝術學院的講話》中說過這樣一段話:俗話說,走馬看花不如駐馬看花,駐馬看花不如下馬看花,我 希望你們都要下馬看花。是的,有時候技術學到一定階段,很多細節知識確實需要我們 窮波討源,細緻的研究,今天和大家聊得是alert 日誌中出現Private strand flush not c... ...
  • 昨天在一資料庫(SQL Server 2008 R2 SP3)上部署了一個作業,今天早上收到告警郵件,作業執行報錯“Unable to start execution of step 1 (reason: Variable SQLLOGDIR not found). The step failed”... ...
  • 在RMAN的RECOVER還原過程中,RMAN界面正常,但是檢查、刷新告警日誌,發現告警日誌裡面有ORA-279,如下所示: alter database recover logfile '/u06/archivelog/2019_02_19/o1_mf_1_16228_g6oznpbv_.arc'... ...
  • 沒有安裝VC++2015(Microsoft Visual C++ 2015 Redistributable), 下載地址 點擊download,一個64位的一個32位的。 ...
  • sql 語句 獲取某張表某列欄位最短的某幾行數據 SELECT C_name,C_code FROM Catalog where LEN(C_code)=LEN((SELECT top 1 C_code FROM Catalog order By LEN(C_code))) ...
  • 在命令行輸入修改密碼: 再次登陸即可。 ...
  • Redis教程 一、入門 1. 什麼是NoSql NoSQL一詞最早出現於1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關係資料庫。2009年,Last.fm的Johan Oskarsson發起了一次關於分散式開源資料庫的討論,來自Rackspace的Eric Ev ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...