在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下intval()和(int)转换使用与区别
Jul 18 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
php截取视频指定帧为图片
May 16 PHP
php插入mysql数据返回id的方法
May 31 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 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 存取 MySQL 数据库的一个例子
2006/10/09 PHP
PHP网站基础优化方法小结
2008/09/29 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
ini_set的用法介绍
2014/01/07 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python 多线程实例详解
2017/03/25 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
公司成立感言
2014/01/11 职场文书
售后求职信范文
2014/03/15 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
客服专员岗位职责
2015/02/10 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
花木兰观后感
2015/06/10 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL