1. 程式人生 > >解決mongod百萬級資料去重

解決mongod百萬級資料去重

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]