在MongoDB中模拟Auto Increment的php代码

时间:2022-09-12 14:03:40

代码大致如下所示: 

复制代码代码如下:


<?php 
function generate_auto_increment_id($namespace, array $option = array()) 

$option += array( 
'init' => 1, 
'step' => 1, 
); 
$instance = new Mongo(); 
$instance = $instance->selectCollection('_seq', 'seq'); 
$seq = $instance->db->command(array( 
'findAndModify' => 'seq', 
'query' => array('_id' => $namespace), 
'update' => array('$inc' => array('id' => $option['step'])), 
'new' => true, 
)); 
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))); 
?> 

 

其具体实现方式主要是利用MongoDBfindAndModify命令,只要每次往MongoDB里insert对象前生成ID赋值给_id就OK了,因为它的实现满足原子性,所以不存在并发问题。

另外说明一点,findAndModify本身提供了一个upsert参数,为true的话可以自动insert,但那样就不能自定义初始值了,所以文中示例没有使用upsert。

BTW,数据库“_seq”的名字以下划线开头,这样列表的时候会排在前面,更容易分辨些。

参考:Auto Increment with MongoDB