Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb mongo 3在唯一索引上重复-dropDups_Mongodb_Indexing_Unique_Duplicate Removal - Fatal编程技术网

Mongodb mongo 3在唯一索引上重复-dropDups

Mongodb mongo 3在唯一索引上重复-dropDups,mongodb,indexing,unique,duplicate-removal,Mongodb,Indexing,Unique,Duplicate Removal,mongoDB的文档中说: “在3.0版中更改:dropDups选项不再可用。” 如果我真的想创建一个唯一的索引并销毁重复的条目,我能做些什么(降级除外) 请记住,我每秒收到大约300个插入,所以我不能删除所有重复的内容,希望在我完成索引时没有任何内容 YesdropDupes现在已从2.7.5版开始,因为无法正确预测在此过程中将删除哪个文档 通常,您有两个选项: 使用新集合: 创建一个新集合 在此新集合上创建唯一索引 运行批处理以将所有文档从旧集合复制到新集合,并确保在此过程中忽略重复的密钥

mongoDB的文档中说: “在3.0版中更改:dropDups选项不再可用。”

如果我真的想创建一个唯一的索引并销毁重复的条目,我能做些什么(降级除外)


请记住,我每秒收到大约300个插入,所以我不能删除所有重复的内容,希望在我完成索引时没有任何内容

Yes
dropDupes
现在已从2.7.5版开始,因为无法正确预测在此过程中将删除哪个文档

通常,您有两个选项:

  • 使用新集合:

    • 创建一个新集合
    • 在此新集合上创建唯一索引
    • 运行批处理以将所有文档从旧集合复制到新集合,并确保在此过程中忽略重复的密钥错误
  • 在您自己的收藏中手动处理:

    • 确保不会在代码中插入更多重复的文档
    • 对您的收藏运行批处理以删除重复项(如果它们不完全相同,请确保保留好的一个)
    • 然后添加唯一索引
  • 对于您的特殊情况,我建议您选择第一个选项,但有一个技巧:

    • 创建具有唯一索引的新集合
    • 更新代码,以便您现在在两个表中插入文档
    • 运行批处理以将所有文档从旧集合复制到新集合(忽略重复的密钥错误)
    • 重命名新集合以匹配旧名称
    • 重新更新代码,使您现在只在“旧”集合中编写

    正如@Maxime Beugnet所强调的,您可以创建一个批处理脚本来从集合中删除重复项。我在下面介绍了我的方法,如果与集合大小相比,副本的数量较少,那么这种方法相对较快。出于演示目的,此脚本将消除由以下脚本创建的集合的重复:

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