mongoDb刪除重複數據

注:mongodb當前版本是3.4.3

查詢存在重複的數據:

查詢並循環刪除重複數據:

刪除語句解析:

db.userInfo.aggregate([

    {

        $group: { _id: {userName: '$userName',age: '$age'},count: {$sum: 1},dups: {$addToSet: '$_id'}}

    },

    {

        $match: {count: {$gt: 1}}

    }

]).forEach(function(doc){

    doc.dups.shift();

    db.userInfo.remove({_id: {$in: doc.dups}});

})

1.根據userName和age分組並統計數量,$group只會返回參與分組的字段,使用$addToSet在返回結果數組中增加_id字段

2.使用$match匹配數量大於1的數據

3.doc.dups.shift();表示從數組第一個值開始刪除;作用是踢除重複數據其中一個_id,讓後面的刪除語句不會刪除所有數據

4.使用forEach循環根據_id刪除數據

$addToSet 操作符只有在值沒有存在於數組中時纔會向數組中添加一個值。如果值已經存在於數組中,$addToSet返回,不會修改數組。

注意:forEach和$addToSet的駝峯寫法不能全部寫成小寫,因爲mongodb嚴格區分大小寫、mongodb嚴格區分大小寫、mongodb嚴格區分大小寫,重要的事情說三遍!

 

 

 

聚合框架它是數據聚合的一個新框架,其概念類似於數據處理的管道。 每個文檔通過一個由多個節點組成的管道,每個節點有自己特殊的功能(分組、過濾等),文檔經過管道處理後,最後輸出相應的結果。

管道基本的功能有兩個:

一是對文檔進行“過濾”,也就是篩選出符合條件的文檔;

二是對文檔進行“變換”,也就是改變文檔的輸出形式。

errmsg:Exceeded memory limit for $group,but didn't allow external Sort.Pass allowDiskuse:true

錯誤詳細信息:

我這次用的表的數據量是:大約有四百萬數據

我要查的是:用戶接受信息最多的前五個用戶

完分析語句,嚴格按照語法寫的;

既然出現問題,我們來一下Debug(咱們碼農有力量)

如果管道沒有給出預期結果,就需要進行調試,調試時,可以先只指定第一個管道操作符,如果這樣得到了預期結果,那就再指定第二個管道操作符,以上面的例子說,先試着$project 操作符進行聚合,如果這個操作符結果是有效的,就在添加 $group 操作符,

如果結果還是有效的,就再添加 $sort,最後再添加 $limit 操作符,這樣就可以逐步定位到造成問題的操作符了。

逐步調試發現沒問題 不是語法的錯誤

麻蛋,原因是聚合的結果必須要限制在16M以內操作,(mongodb支持的最大影響信息的大小),否則必須放在磁盤中做緩存(allowDiskUse=True)。

最後把要統計的數據給搞出來了,喜大普奔。。。。

zs-----------------------------------------

db.redis_key.aggregate([
{
$group: { _id: {redis_key: '$redis_key'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
},
{
$match: {count: {$gt: 1}}
}
],{allowDiskUse:true}).forEach(function(doc){
doc.dups.shift();
db.redis_key.remove({_id: {$in: doc.dups}});
})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章