網站首頁 編程語言 正文
需求
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-08-25 Python面向對象的三大特性封裝、繼承、多態_python
- 2023-05-30 Pandas.concat連接DataFrame,Series的示例代碼_python
- 2022-09-02 SQL注入的四種防御方法總結_數據庫其它
- 2022-12-04 pyecharts如何旋轉折線圖的X軸標簽_python
- 2022-10-13 Go?Excelize?API源碼閱讀SetSheetViewOptions示例解析_Golang
- 2023-06-16 Pytorch中的?torch.distributions庫詳解_python
- 2023-04-22 Python中DataFrame與內置數據結構相互轉換的實現_python
- 2022-12-10 C++中如何將數據保存為CSV文件_C 語言
- 最近更新
-
- 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同步修改后的遠程分支