mongodb 陣列更新

2021-10-04 11:11:35 字數 1679 閱讀 1763

原因:線上資料中,陣列項某個value存在前置空格

# 資料格式如下(手動輸入的,json串格式可能有問題):,	,

, ]}

# 存在空格的資料為 key="key1"

導致原因
使用者在提交時不小心加了個空格(可能是複製貼上的),程式也沒有對這部分做處理;

本來可以從後台管理系統修改,但是諮詢產品,這部分修改貌似有問題,但記不清楚了(才維護的專案,流量巨大-類目專案)

根據目前看來只能採取走sql的方式更新

問題分析
1、通過**找到使用的mongodb查詢語句類似於

mongodb.query(

"categoryid"

).is(categoryid).and(

"categorytype"

).is(23);

使用命令查詢語句為

db.getcollection(

'category***'

).find(

) 返回結果如文章開頭所示

2、最開始想直接通過update更新,前提是query查詢條件為,僅僅查詢需要更新這個陣列的key和value

3、但網上找這種命令,沒有類似的。陣列中只有乙個屬性的倒是一堆攻略,對應嘗試寫的命令就不公布了(主要是沒有記錄下來)

4、考慮到使用先刪除當前資料,然後使用插入(居然沒有想到只更新陣列部分)。沒有這樣做的原因:

1) 這個專案呼叫量巨大

2) 而且專案啟動後,做了大量快取(處理時不知道),涉及到mongodb為實時(不清楚直接刪除,會對快取更新是否及時)

3) 關鍵是要的急,接手後一直未修改專案內容

4) 通過類目id呼叫這個流量具體有多少

5) 可能是因為呼叫量大吧,大部分介面返回資料多,沒有記錄入參和出參

5、後來想到個折中的辦法

1) 線上通過mongodb工具可以檢視資料(貌似可以申請修改資料許可權,那這個問題解決就是幾秒鐘的事)

2) 詢問dba,能否通過這種方式修改,前提還是要走jira(專案管理功能句)

3) dba回答是no,通過update更新

6、結果又轉回來了 ?

無意間問起同事,之前處理過類似問題沒,結果告訴我來公司沒有用過mongodb。但是他說可能通過把現有陣列所有資料放到修改項中,這樣應該可以了修改吧。

覺得他說的有道理,就在測試環境測試一番,結果可行

最終解決方案
# remove

db.getcollection(

'category***'

).remove(

)# find

db.getcollection(

'category***'

).find(

)# insert

db.getcollection(

'category***'

).insert(,,]

})# update

db.getcollection(

'category***'

).update(

,,,]}}

)# 就是通過上面4條語句來回測試即可 會存在將線上資料考下來格式問題,通過類似於notepad++之類的文字編輯工具替換即可,相信大家都會

# *** 問題就是這樣解決的 好開森,可以去洗澡了

mongoDB的update 更新陣列內資料

db.data dict.find set表示更新 dictvaluelist 的所有內容,會替換掉原來的值 db.data dict.update push表示向list列表中壓入乙個值,在list中的最後一位 db.data dict.update push 也可以直接push陣列 db.dat...

mongodb更新資料

updates函式接受3個引數 critera 指定查詢,選擇將要更新的文件 objnew 指定更新資訊,也可用操作符完成 options 指定更新文件時的選項,可選值有upsert和multi.upsert 如果資料存在就更新,否則建立資料。multi 指定是否更新所有匹配文件,或者只更新第乙個匹...

十二 mongodb之陣列更新運算子

陣列更新運算子 運算子含義 充當佔位符以更新與查詢條件匹配的第乙個元素,佔位符 代表匹配條件的第乙個元素 充當佔位符以更新陣列中與查詢條件匹配的文件中的所有元素 identifier 充當佔位符以更新與查詢條件匹配的文件的arrayfilters條件匹配的所有元素 addtoset 僅當陣列中尚不存...