我试图根据here描述的方法在大型集合中删除MongoDB中的重复文档:
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 :(得分:0)
错误消息表明进程的某些部分正在尝试创建一个大于MongoDB中16 MB文档大小限制的文档。
在不知道您的数据集的情况下,我猜测集合的大小足够大,以至于唯一的firstId / secondId组合的数量增加了超过文档大小限制的结果集。
如果集合的大小阻止在一个操作中查找所有重复值,您可能需要尝试将其分解并遍历集合并查询以查找重复值:
SELECT role.id
它可能不是最有效的实现,但你明白了。
请注意,此方法严重依赖于索引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)
})