2012-03-14 96 views
1

在mongodb中,我们可以将自己的值赋给_id字段,只要它是唯一的,“_id”字段值可以是任何类型的数组, - 从docs在mongodb“_id”字段中插入的重复值

但在我的活动数据库中,我可以看到一些记录被复制如下,

db.memberrecords.find().limit(2).forEach(printjson) 
{ 
     "_id" : "999783", 
     "Memberid" : "999783", 
     "Name" : "ASHEESH SHARMA", 
     "Gender" : "M", 
} 
{ 
     "_id" : "999783", 
     "Memberid" : "999783", 
     "Name" : "Sanwal Singh Meena", 
     "Gender" : "M", 
} 

在上面的记录,同样_id值在表中插入两次。当我与本地数据库测试它是不是允许插入相同_id记录,并抛出错误如下,

E11000 duplicate key error index: mongoms.memberrecords.$_id_ dup key: { : "999783" } 

下面是我的生活memberrecords表的索引(参考),

db.memberrecords.getIndexes() 
[ 
     { 
       "name" : "_id_", 
       "ns" : "mongoms.memberrecords", 
       "key" : { 
         "_id" : 1 
       }, 
       "v" : 0 
     }, 
     { 
       "_id" : ObjectId("4f0bcdf2b1513267f4ac227c"), 
       "ns" : "mongoms.memberrecords", 
       "key" : { 
         "Memberid" : 1 
       }, 
       "name" : "Memberid_1", 
       "unique" : true, 
       "v" : 0 
     } 
] 

注意:我有两张这张桌子的分片。

对此的任何建议请

回答

1

你的分片键是_id字段吗?在集群中只能有一个唯一的索引:分片键(否则服务器必须检查每个插入的每个分片)。

所以:在一个分片上,_id将是唯一的。但是,如果它不是您的分片键,则所有投注都会在多个分片中关闭。

请参阅http://www.mongodb.org/display/DOCS/Sharding+Limits#ShardingLimits-UniqueIndexesDOCS%3AIndexes%23UniqueIndexes

+0

我使用PHP来查询mongo。所以为了避免重复插入,我需要更改插入记录之前将执行选择查询的代码,并且如果记录可用,那么我需要更新记录。 是否有任何简化/解决方法可用于避免重复插入? – Raja 2012-03-14 15:36:37

+0

使用您需要唯一的字段作为分片键。 – kristina 2012-03-14 18:37:16