Java 如何从MongoDB集合中删除重复项

Java 如何从MongoDB集合中删除重复项,java,mongodb,mongodb-query,Java,Mongodb,Mongodb Query,我在mongodb中收集了大量文档(约270万个文档),其中有很多重复文档。我尝试在集合上运行ensureIndex({id:1},{unique:true,dropDups:true}) 它向我显示了这个错误: { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "ok" : 0, "errmsg" : "too may dups on index

我在mongodb中收集了大量文档(约270万个文档),其中有很多重复文档。我尝试在集合上运行
ensureIndex({id:1},{unique:true,dropDups:true})

它向我显示了这个错误:

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "ok" : 0,
        "errmsg" : "too may dups on index build with dropDups=true",
        "code" : 10092
}

主要问题是我无法重新插入文档。

可能不是一个很好的解决方案,但您可以定义一个新集合并将其命名为
coll2

在上面定义您的唯一索引

读取第一个集合中的所有项目

db.collection.find().addOption(DBQuery.Option.awaitData).forEach(function(doc)
{
    db.coll2.insert(doc, {continueOnError: true})
});
之后,删除旧集合并将
coll2
重命名为旧集合名称


对于270万个文档,创建具有唯一索引的新数据库,然后通过(set continueOnError:true)db.collection1.drop()复制所有项目需要一些时间删除整个其他集合db.collection1_backup.find().forEach(函数(doc){db.collection1.insert(doc);//开始替换})@完整答案。它需要它,除非您可以搜索重复的文件。我通过使用Java程序获得了解决方案,但感谢您的贡献。如果您仍要迭代所有文档,我认为更直接的方法是按
id
字段(假设该字段想要唯一)和
remove()进行迭代
重复文档(其中当前的
id
与前面看到的文档匹配)。这将避免重新插入文档的开销,这将导致重复的键错误。作为第一步,这需要在
id
上添加一个非唯一索引(内存排序限制为32MB),然后删除并重新添加带有unique属性的索引。@Stennie,正如我所说的,这不是一个很好的解决方案,但我认为我使用光标来迭代结果(并且没有使用snaphop()和toArray(),它没有使用32mb ramIt,实际上我的方法需要索引,因为我建议在迭代时按
id
排序以查找唯一性:)。听起来像是要使用a,它将始终使用
\u id
索引。您当前的示例具有选项集,该选项用于。