代幣大致如下示:
复制代 代幣大致如下:
functiongenerate_auto_increment_id($namespace, array $option = array())
{
$option += array(
'init' => 1,
'ステップ' => 1,
);
$instance = new Mongo();
$instance = $instance->selectCollection('_seq', 'seq');
$seq = $instance->db->command(array(
'findAndModify' => 'seq',
'query' => array('_id' => $名前空間)、
'update' => array('$inc' => array('id' => $option['step']))、
'new' =>
));
if (isset($seq['value']['id'])) {
return $seq['value']['id'];
}
$instance->insert(array(
'_id' => $namespace,
'id' => $option['init'],
)) ;
return $option['init'];
}
var_dump(generate_auto_increment_id('foo'));
var_dump(generate_auto_increment_id('bar', array('init' => 123)));
?>
その具体的な実装方法は、主に MongoDB 内の findAndModify コマンドを使用することであり、毎回 MongoDB にオブジェクトを挿入する前に ID 値 unt_id が OK になるだけで、十分な原子性が実現されているため問題は発生しません。 >
さらに、findAndModify 自体に upsert パラメータが用意されており、true の場合は自動的に挿入できますが、初期値を自動的に定義することはできないため、この例では upsert を使用していません。ところで、データベース「_seq」の名前が行頭の下にあるため、このようなリストの時間が前に来ると、より簡単に分割できます。
参考:MongoDB による自動インクリメント