在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 json_encode奇怪问题说明
Sep 27 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
基于PHP服务端图片生成缩略图的方法详解
Jun 20 PHP
php数组编码转换示例详解
Mar 11 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
PHP整合PayPal支付
Jun 11 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
mac os快速切换多个PHP版本的方法
Mar 07 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
php的单例模式及应用场景详解
Feb 27 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 cli 方式 在crotab中运行解决
2010/02/08 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
jquery属性过滤选择器使用示例
2013/06/18 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
vue组件实例解析
2017/01/10 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
numpy中索引和切片详解
2017/12/15 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python列表使用实现名字管理系统
2019/01/30 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
演讲稿的写法
2014/05/19 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
运动会跳远广播稿
2015/08/19 职场文书
党员干部学习心得体会
2016/01/23 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书