在MongoDB中模拟Auto Increment的php代码

2015-01-24信息快讯网

MySQL用户多半都有Auto Increment情结,不过MongoDB缺省并没有实现,所以需要模拟一下,编程语言以PHP为例

代码大致如下所示:
 
<?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))); 
?> 

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

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

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

参考:Auto Increment with MongoDB

php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
PHP sprintf() 函数的应用(定义和用法)
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
深入理解PHP之数组(遍历顺序) Laruence原创
header中Content-Disposition的作用与使用方法
PHP的异常处理类Exception的使用及说明
php中json_decode()和json_encode()的使用方法
PHP通过session id 实现session共享和登录验证的代码
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
php提示undefined index的几种解决方法
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
php 的加密函数 md5,crypt,base64_encode 等使用介绍
JS中encodeURIComponent函数用php解码的代码
修改PHP的memory_limit限制的方法分享
php 无法加载mysql的module的时候的配置的解决方案引发的思考
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
php模板中出现空行解决方法
PHP数组交集的优化代码分析
php SQL Injection with MySQL
PHP下通过file_get_contents的代理使用方法
php批量缩放图片的代码[ini参数控制]
延长phpmyadmin登录时间的方法
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
PHP JSON格式数据交互实例代码详解
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
php INI配置文件的解析实现分析
PHP strncasecmp字符串比较的小技巧
php array_unique之后json_encode需要注意
从php核心代码分析require和include的区别
ThinkPHP中实例Model方法的区别说明
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
PHP chmod 函数与批量修改文件目录权限
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
©2014-2024 dbsqp.com