解決mongod百萬級資料去重
阿新 • • 發佈:2018-12-24
mongodb的表結構如下
注:圖上看的眼花繚亂,這個是模擬生成環境下的資料,我不得不做了一些處理。
假定:圖中表格資料操作100萬條,以name和introduction為依據,對資料進行去重。
首先想到的是distinct,但這個是兩個欄位,不好處理。還有一個就是:資料量一旦大的時候,distinct不僅僅是效能下降的問題,而是會出現超出記憶體閾值的異常,直接導致這個功能使用不了。
"errmsg" : "distinct too big, 16mb cap",
對於mongodb我就是一個小白,百度了也沒有找到,google又都是洋文(等我看懂了,估計我被炒魷魚回家了)。
其他不說,說了那麼多也沒人看,直接上程式碼。
db['mycollection'].aggregate([ //對特定的欄位分組 {$group:{_id:{name:"$name", introduction:"$introduction"},total:{$sum:1}}}, //過濾分組的欄位,選擇顯示大於一條的資料 {$match:{total:{$gt:1}}}, //{$limit:2000}, {$sort:{total:-1}}, //排序 ], //加上這個條件就是避免出現超出記憶體閾值的異常 { allowDiskUse: true } ).forEach(function(event) { //對重複資料進行去重 var i = 0; db['mycollection'].find({"name":event._id.name, "introduction":event._id.introduction, "delete": { $ne: "1" } }).forEach(function(n) { if(i==0) { //第一條資料不去重 print("_id"+n._id + "**name"+n.name); }; if(i > 0) { //db['baike.figure_new'].update("_id", n._id, "delete":"1"); //重複資料使用delete欄位標註,驗證該資料是否重複資料 db['baike.figure_new'].update({"_id":ObjectId(''+n._id+'')}, {$set:{"delete":"1"}}); }; i++; }); //print(event._id.name + " " + event._id.introduction); })
程式碼中有註釋,供大家參考。
程式碼在生產環境下驗證過了,水平有限可能還存在錯誤和想給我建議,郵件:[email protected]