解决" BSONObj大小:17582686(0x10C4A5E)无效"在MongoDB中进行聚合时?

时间:2016-11-30 14:21:48

标签: mongodb

我试图根据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。

1 个答案:

答案 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) })

的存在