網站首頁 編程語言 正文
需求
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
相關推薦
- 2022-10-05 python?matplotlib自定義colorbar顏色條及內置色條詳解_python
- 2022-10-14 nginx gzip 壓縮配置
- 2022-05-22 docker部署訪問postgres數據庫的實現方法_docker
- 2022-05-12 Kotlin 擴展函數 鏈式調用 泛型與擴展函數
- 2022-01-06 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to
- 2022-11-10 ASP.NET?MVC使用Quartz.NET執行定時任務_實用技巧
- 2022-08-04 C語言實現快速排序算法實例_C 語言
- 2022-12-27 python中內置庫csv的使用及說明_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支