在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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
redis 队列操作的例子(php)
Apr 12 PHP
php简单浏览目录内容的实现代码
Jun 07 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
PHP培训要多少钱
Jun 06 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
文本链接逐个出现的js脚本
2007/12/12 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
浅谈Python中数据解析
2015/05/05 Python
python-str,list,set间的转换实例
2018/06/27 Python
Python中is和==的区别详解
2018/11/15 Python
Python字典的核心底层原理讲解
2019/01/24 Python
python安装scipy的步骤解析
2019/09/28 Python
python数据化运营的重要意义
2019/11/25 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
大学生最新职业生涯规划书范文
2014/01/12 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
疾病证明书
2015/06/19 职场文书
廉洁自律证明
2015/06/24 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL