在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配置心得包含MYSQL5乱码解决
Nov 20 PHP
php获得当前的脚本网址
Dec 10 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
php防注入及开发安全详细解析
Aug 09 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
php目录操作实例代码
Feb 21 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
Yii2 assets清除缓存的方法
May 16 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP使用Redis长连接的方法详解
Feb 12 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注释实例技巧
2008/10/03 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
django中嵌套的try-except实例
2020/05/21 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
中专毕业生个人职业生涯规划
2014/02/19 职场文书
管理建议书范文
2014/05/13 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
在校实习生求职信
2014/06/18 职场文书
农村党员对照检查材料
2014/09/24 职场文书
庆七一宣传标语
2014/10/08 职场文书
语文教师求职信范文
2015/03/20 职场文书
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server