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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...