1. 程式人生 > >mongoDb刪除重複資料

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}}); })