在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中使用Akismet防止垃圾评论的代码
Jun 10 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
基于php split()函数的用法详解
Jun 05 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php实现计数器方法小结
Jan 05 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
php判断当前操作系统类型
Oct 28 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
YII Framework框架教程之日志用法详解
Mar 14 PHP
php pdo连接数据库操作示例
Nov 18 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
其他功能
2006/10/09 PHP
Php注入点构造代码
2008/06/14 PHP
PHP整合PayPal支付
2015/06/11 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python获取交互式ssh shell的方法
2019/02/14 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
快递业务员岗位职责
2014/01/06 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
药品开票员岗位职责
2015/04/15 职场文书
导游词之太原天龙山
2020/01/02 职场文书