在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 相关文章推荐
全文搜索和替换
Oct 09 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
PHP实现小程序批量通知推送
Nov 27 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
laravel框架的安装与路由实例分析
Oct 11 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 文件扩展名 获取函数
2009/06/03 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
jquery json 实例代码
2010/12/02 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
小程序如何构建骨架屏
2019/05/29 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Python实现在线音乐播放器
2017/03/03 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
python如何爬取网页中的文字
2020/07/28 Python
Django实现简单的分页功能
2021/02/22 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
村委会换届选举方案
2014/05/03 职场文书
个人承诺书格式
2014/06/03 职场文书
医院义诊活动总结
2014/07/04 职场文书
护士求职简历自我评价
2015/03/10 职场文书
培训班通知
2015/04/25 职场文书
毕业设计致谢语
2015/05/14 职场文书