_id上的文件重复(在mongo中)

时间:2012-06-28 09:35:46

标签: mongodb duplicates

我有一个分片的mongo集合,有超过1.5万的文档。我使用_id列作为分片键,此列中的值是整数(而不是ObjectIds)。

我在这个集合上做了很多写操作,使用Perl驱动程序(插入,更新,删除,保存)和mongoimport。

我的问题是,不知何故,我在同一个_id上有重复的文件。从我读过的内容来看,这是不可能的。

我删除了重复项,但其他人仍然出现。

你有什么想法可以来自哪里,或者我应该从什么开始看? (另外,我试图在较小的测试集合上复制它,但无论我执行什么写操作,都不会插入重复项。)

2 个答案:

答案 0 :(得分:3)

这实际上不是Perl驱动程序的问题..它与分片的特征有关。 MongoDB只能在创建时强制位于单个分片上的文档中的唯一性,因此默认索引不需要唯一性。

MongoDB: Configuring Sharding文档中,特别提到:

  • 对分片进行分片时,必须指定分片键。如果集合中有数据,mongo将需要预先创建索引(它加快了分块过程);否则,将自动为您创建索引。

  • 只要唯一索引是分片键的前缀,就可以使用{unique:true}选项确保基础索引强制实施唯一性。

  • 如果未使用“unique:true”选项,则分片键不必是唯一的。

答案 1 :(得分:1)

你是如何实现生成整数ID的?

如果您使用的系统与MongoDB网站上建议的系统一样,那么您应该没问题。供参考:

function counter(name) {
    var ret = db.counters.findAndModify({
         query:{_id:name}, 
         update:{$inc:{next:1}}, 
         "new":true, 
         upsert:true});

    return ret.next;
}

db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1
db.users.insert({_id:counter("users"), name:"Bob D."}) // _id : 2

如果您通过读取文档存储中的最新记录来生成ID,然后递增perl代码中的数字,然后使用递增的数字插入,则可能会遇到计时问题。

相关问题