在MongoDB中模拟Auto Increment的php代码


Posted in PHP onMarch 06, 2011

代码大致如下所示:

<?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 相关文章推荐
PHP面向对象编程快速入门
Oct 09 PHP
PHP insert语法详解
Jun 07 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
May 04 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
为你总结一些php信息函数
Oct 21 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
PHP文件上传处理案例分析
Oct 15 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
PHP数组交集的优化代码分析
Mar 06 #PHP
php下安装配置fckeditor编辑器的方法
Mar 02 #PHP
PHP如何抛出异常处理错误
Mar 02 #PHP
php中实现记住密码自动登录的代码
Mar 02 #PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 #PHP
php Smarty 字符比较代码
Feb 27 #PHP
php下批量挂马和批量清马代码
Feb 27 #PHP
You might like
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python中关键字is与==的区别简述
2014/07/31 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python实现从字典中删除元素的方法
2015/05/04 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python之super的使用小结
2018/08/13 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
Python实现数字的格式化输出
2020/08/01 Python
python不同版本的_new_不同点总结
2020/12/09 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
《小草和大树》教学反思
2014/02/16 职场文书
教师读书活动总结
2014/05/07 职场文书
销售口号大全
2014/06/11 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
2014年班干部工作总结
2014/11/25 职场文书
社会实践心得体会范文
2016/01/14 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang
Nginx配置之禁止指定IP访问
2022/05/02 Servers