在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 读取文件内容代码(txt,js等)
Dec 06 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
May 05 PHP
PHP中的Streams详细介绍
Nov 12 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
thinkphp循环结构用法实例
Nov 24 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
Yii编程开发常见调用技巧集锦
Jul 15 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
php木马攻击防御之道
2008/03/24 PHP
php 无限极分类
2008/03/27 PHP
PHP Array交叉表实现代码
2010/08/05 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
JavaScript静态的动态
2006/09/18 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
javascript arguments使用示例
2014/12/16 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
简单介绍python封装的基本知识
2019/08/10 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
对祖国的寄语大全
2014/04/11 职场文书
英文慰问信范文
2015/03/24 职场文书
入党团支部推荐意见
2015/06/02 职场文书
疾病证明书
2015/06/19 职场文书
初中生活随笔
2015/08/15 职场文书
话题作文之呼唤
2019/12/18 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
Vue Element plus使用方法梳理
2022/12/24 Vue.js