5

我有一个分片的 mongo 集合,包含超过 150 万份文档。我使用 _id 列作为分片键,并且该列中的值是整数(而不是 ObjectIds)。

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

我的问题是,不知何故,我在同一个_id 上有重复的文档。根据我的阅读,这应该是不可能的。

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

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

4

2 回答 2

4

这其实不是 Perl 驱动的问题。。这和 sharding 的特性有关。MongoDB 在创建时只能在位于单个分片上的文档之间强制执行唯一性,因此默认索引不需要唯一性。

MongoDB: 配置分片文档中,特别提到:

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

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

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

于 2012-06-28T11:34:57.793 回答
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 代码中增加数字,然后插入增加的数字,您可能会遇到计时问题。

于 2012-06-28T10:52:48.780 回答