在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 insert语法详解
Jun 07 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
Zend Framework教程之视图组件Zend_View用法详解
Mar 05 PHP
PHP中overload与override的区别
Feb 13 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 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
Chrome Web App开发小结
2014/09/04 PHP
composer.lock文件的作用
2016/02/03 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
python缩进区别分析
2014/02/15 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
Python新手如何理解循环加载模块
2020/05/29 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
行政求职信
2014/07/04 职场文书
数学教育专业求职信
2014/07/22 职场文书
同学聚会通知短信
2015/04/20 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript