2016-11-30 21 views
0

我試圖根據辦法,收集了大量刪除重複文件MongoDB中描述here在MongoDB中進行聚合時,解決「BSONObj大小:17582686(0x10C4A5E)無效」?

db.events.aggregate([ 
    { "$group": { 
     "_id": { "firstId": "$firstId", "secondId": "$secondId" }, 
     "dups": { "$push": "$_id" }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$match": { "count": { "$gt": 1 } }} 
], {allowDiskUse:true, cursor:{ batchSize:100 } }).forEach(function(doc) { 
    doc.dups.shift(); 
    db.events.remove({ "_id": {"$in": doc.dups }}); 
}); 

即我想刪除具有相同「firstId - secondId」組合的事件。但過了一段時間,MongoDB迴應了這個錯誤:

2016-11-30T14:13:57.403+0000 E QUERY [thread1] Error: getMore command failed: { 
    "ok" : 0, 
    "errmsg" : "BSONObj size: 17582686 (0x10C4A5E) is invalid. Size must be between 0 and 16793600(16MB)", 
    "code" : 10334 
} 

有沒有辦法解決這個問題?我正在使用MongoDB 3.2.6。

回答

0

錯誤消息指示進程的某些部分正在嘗試創建大於MongoDB中16 MB文檔大小限制的文檔。

如果不知道您的數據集,我會猜想集合的大小足夠大,以致唯一firstId/secondId組合的數量正在增加超過文檔大小限制的結果集。

如果集合的大小阻止發現在一個操作中的所有重複值,你可能想嘗試打破它,並遍歷集合和查詢找到重複的值:

db.events.find({}, { "_id" : 0, "firstId" : 1, "secondId" : 1 }).forEach(function(doc) { 
    cnt = db.events.find( 
    { "firstId" : doc.firstId, "secondId" : doc.secondId }, 
    { "_id" : 0, "firstId" : 1, "secondId" : 1 } // explictly only selecting key fields to allow index to cover the query 
).count() 

    if(cnt > 1) 
    print('Dupe Keys: firstId: ' + doc.firstId + ', secondId: ' + doc.secondId) 
}) 

這可能不是最有效的實施,但你明白了。

注意,這種方法在很大程度上依賴於該指數的存在{ 'firstId' : 1, 'secondId' : 1 }

+0

但是,什麼是你如何在實際打印他們刪除重複後,因爲這個控制檯AFAICT建議嗎? (確實有很多重複的內容) – Johan

+0

上面的腳本可以修改爲將記錄保存到某個單獨的集合中,之後您可以執行任何清除操作,以刪除或修改重複的記錄。 「打印」行將被改爲'db.dupe_keys.insert({「firstId」:doc.firstId,「secondId」:doc.secondId})''。 –