Mongodb mongo 3在唯一索引上重复-dropDups
mongoDB的文档中说: “在3.0版中更改:dropDups选项不再可用。” 如果我真的想创建一个唯一的索引并销毁重复的条目,我能做些什么(降级除外)Mongodb mongo 3在唯一索引上重复-dropDups,mongodb,indexing,unique,duplicate-removal,Mongodb,Indexing,Unique,Duplicate Removal,mongoDB的文档中说: “在3.0版中更改:dropDups选项不再可用。” 如果我真的想创建一个唯一的索引并销毁重复的条目,我能做些什么(降级除外) 请记住,我每秒收到大约300个插入,所以我不能删除所有重复的内容,希望在我完成索引时没有任何内容 YesdropDupes现在已从2.7.5版开始,因为无法正确预测在此过程中将删除哪个文档 通常,您有两个选项: 使用新集合: 创建一个新集合 在此新集合上创建唯一索引 运行批处理以将所有文档从旧集合复制到新集合,并确保在此过程中忽略重复的密钥
请记住,我每秒收到大约300个插入,所以我不能删除所有重复的内容,希望在我完成索引时没有任何内容 Yes
dropDupes
现在已从2.7.5版开始,因为无法正确预测在此过程中将删除哪个文档
通常,您有两个选项:
- 创建一个新集合
- 在此新集合上创建唯一索引
- 运行批处理以将所有文档从旧集合复制到新集合,并确保在此过程中忽略重复的密钥错误
- 确保不会在代码中插入更多重复的文档
- 对您的收藏运行批处理以删除重复项(如果它们不完全相同,请确保保留好的一个)
- 然后添加唯一索引
- 创建具有唯一索引的新集合
- 更新代码,以便您现在在两个表中插入文档
- 运行批处理以将所有文档从旧集合复制到新集合(忽略重复的密钥错误)
- 重命名新集合以匹配旧名称
- 重新更新代码,使您现在只在“旧”集合中编写
db.numbers.drop()
var counter = 0
while (counter<=100000){
db.numbers.save({"value":counter})
db.numbers.save({"value":counter})
if (counter % 2 ==0){
db.numbers.save({"value":counter})
}
counter = counter + 1;
}
使用光标,您可以在重复记录上进行迭代,并实现您自己的业务逻辑,以决定要删除哪些重复记录。在下面的示例中,我仅保留第一个实例:
while (cur.hasNext()) {
var doc = cur.next();
var index = 1;
while (index < doc.uniqueIds.length) {
db.numbers.remove(doc.uniqueIds[index]);
index = index + 1;
}
}
pip安装mongo\u删除重复索引 最好的方法是创建一个python脚本或使用您喜欢的任何语言,迭代集合,使用db.collectionname.createIndex({'indexname':1},unique:true)创建一个唯一索引设置为true的新集合,并将您的文档从以前的集合插入到新集合中,因为您希望不同的密钥或删除的重复项不会插入到您的新集合中,并且您可以通过异常处理轻松处理ecxeption
查看示例的软件包源代码我不理解您的问题。我是否正确地理解了,您有包括复制品在内的现有文档,现在您希望在联系复制品的字段上放置一个唯一索引,同时潜在的新复制品进来?是的。我想清除DUP,如果有新的DUP出现,我会拒绝它们。我也一直在解决这个问题,是否有其他方法可以在MongoDB>=3中不使用
dropDUP
来清除重复的DUP。*??选项1可能也是重新创建索引的最佳方法,由于实时系统将不得不等待索引重建,这可能会降低其速度。请确保在此过程中忽略重复的密钥错误。
您将如何做到这一点?这些错误似乎停止了事务处理中间使用MongoDB无序大容量插入:“如果在处理其中一个写入操作期间发生错误,MongoDB将继续处理列表中剩余的写入操作。”例如:db.persons.insert([{{u id::“Bob”},{u id:“John”},{u id:“Bob”},{u id:“Marc”}),{ordered:false})将插入3个文档并显示一个重复的密钥错误。使用{ordered:true},只插入前2个。More doc@Quest:记住MongoDB中没有事务:它不是ACID。如果运行10个插入,如果第五个插入返回错误,它将不会回滚。不要将此错误与文档级锁定(一种“迷你”锁定)错误仅针对一个文档的事务为true。DropDups在MongoDB的2.6版本中已被弃用。
while (cur.hasNext()) {
var doc = cur.next();
var index = 1;
while (index < doc.uniqueIds.length) {
db.numbers.remove(doc.uniqueIds[index]);
index = index + 1;
}
}
db.numbers.createIndex( {"value":1},{unique:true})