日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

mongoDB替換replace某個字段的部分內容

作者:大王我親自來巡山 更新時間: 2022-07-12 編程語言

需求

mongoDB是沒有定義replace函數的,那么,如果有需求需要替換nongo中數據的某一部分,怎么辦?因為mongo的shell其實就是個js腳本執行器,因此,js其實是可以執行的,因此,我們可以在精準查詢到需要執行replace的地方的基礎上,用js實現replace。
我遇到的需求是,替換掉所有mongo中domain字段中,以Caleb開頭的,全部替換為go/trend。

查詢

首先,需要先能查詢到所有domain字段的位置,因為我的mongo結構比較復雜,數組嵌套數組,因此,我這里需要復雜查詢。復雜查詢語句的詳細講解請參考我上篇博客:mongo復雜查詢,嵌套多層數組和正則表達式
這是我的查詢語句:
datasource數組下面的stct,stct下面的views數組,views數組下的metricView,metricView下的domain字段,要求以caleb開頭,用正則表達式實現:

db.getCollection('richPage').find({"dataSources":{$elemMatch:{"stct.views":{$elemMatch:{"metricView.domain":{$regex:"Caleb",$options:"$i"}}}}}})

replace

在先能精準定位并查詢到需要改動的字段的基礎上,就可以執行replace操作了,直接上腳本,再慢慢解釋:

db.getCollection('richPage').find({"dataSources":{$elemMatch:{"stct.views":{$elemMatch:{"metricView.domain":{$regex:"Caleb",$options:"$i"}}}}}}).forEach( 
 function(item) {
  var dataSource = item['dataSources'];
  for(var i in dataSource){
    var stct = dataSource[i]['stct'];
    if(stct != null){
     var views = stct['views'];
    if(views != null){
     for(var j in views){
      var domain = views[j]['metricView']['domain'];
      var domainUid = views[j]['metricView']['domainUid'];
      if(domain != null && String(domain).search('Caleb') > -1){
          domain = domain.replace('Caleb', 'Go/Trends');
          domainUid = domainUid.replace('caleb', 'go/trends');
          views[j]['metricView']['domain'] = domain;
          views[j]['metricView']['domainUid'] = domainUid;
        }
      }
    }
}
  }db.getCollection('richPage').updateOne({"_id":item['_id']},{$set:{"dataSources":dataSource,"exec":1}});
  }
 );

因為mongo是沒有replace函數的,又因為mongo的shell解釋器其實是個js解釋器,因此,js是可以用的,那么:
.forEach:就是對查詢到的結果,進行遍歷
item:就是遍歷到的每一個結果集
item[‘dataSources’]:通過中括號的方式拿數據(這里需要特殊說明一下,mongo的shell腳本版本不一樣,取值方式也可能有差別,我這里的是js腳本中的方式,親測可以成功取值)
var domain:用var接收數據后,用js中的replace方法替換需要改動的地方,然后再重新賦值:views[j][‘metricView’][‘domain’] = domain
“_id”:item[‘_id’]:就是選中要更新的item
“dataSources”:dataSource":這里dataSource在js中已經被重新賦值了,我們需要replace的字段包含在dataSource中,因此更新這個屬性就行,當然也可以是別的,只要能包含你所有的改動就行

原文鏈接:https://blog.csdn.net/weixin_43923436/article/details/125715398

欄目分類
最近更新