2011-07-31 32 views
1

我试图建立的MongoDB来测试其速度和正在运行与_id重复一个问题。我不是这样设定的,我让mongodb做,因为我不在乎。我ahve下面的PHP代码:MongoDB _id字段自动生成?

<?php 
$mongo = new Mongo(); 
$db = $mongo->selectDB("scrap_fighters"); 
$collection = $db->selectCollection('scores'); 

$data = array 
(
    'user_id' => 1, 
    'name' => 'John Doe', 
    'score' => 120 
); 

$start = microtime(true); 
for($x=0; $x < 1000; $x++) 
{ 
    $data['unqiue'] = microtime(); 
    $result = $collection->insert($data, array('safe' => true)); 
} 
?> 

MongoDB使用什么来生成他们的“唯一”ids?我甚至尝试用独特的替换:

$data['unqiue'] = rand(1, 1000000); 

要100%确定它正在工作,但它仍然在第一次写入后失败。我是否可以不输入具有相同数据的记录,而无需自己生成唯一的身份证明?

回答

1

MongoDB使用_id作为主键,因此它必须是唯一的。由于您没有指定它,它会自动生成。它由基于主机的微秒时间戳和散列组成,所以即使有多个主机同时插入,碰撞的可能性也非常低。

什么是你正在使用这个unique领域?如果你想让它成为主键,就不要设置它。

关于失败的重复:我能想到这种情况发生的唯一原因是,你之前设置在此集合这需要一些字段(或字段的组合)是唯一的指标。如果不需要,请将其移除。如果它是有效的(例如:user_id必须是唯一的),那么插入唯一的记录。

+0

独特的领域是_id和我的代码显示,我不是自动设置_id这就是为什么它是怪异的正在冲突的_id值自动生成的_id。这也是一个全新的集合(在脚本执行之前不存在),所以这个集合上没有其他索引。 – ryanzec

+0

drop集合,插入并检查生成的_id(s)后执行var_dump($ data)。 –

+1

答:哈哈哈,我不知道该插件调用添加_id到阵列中。我添加了unset($ data ['_ id'])到它的结尾,它工作正常,谢谢。 – ryanzec