在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学习 计数器实例代码
Jun 15 PHP
php下使用strpos需要注意 === 运算符
Jul 17 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
php调用自己java程序的方法详解
May 13 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
浅谈PHP的反射API
Feb 26 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 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中数字、字符与对象判断函数用法实例
2014/11/26 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
js的写法基础分析
2011/01/17 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
python 模拟登陆github的示例
2020/12/04 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
美国探亲签证邀请信
2014/02/05 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
辩论赛主持词
2014/03/18 职场文书
竞聘演讲稿怎么写
2014/08/28 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2014年物流工作总结
2014/11/25 职场文书
Django migrate报错的解决方案
2021/05/20 Python
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS