在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 socke 向指定页面提交数据
Jul 23 PHP
PHP 面向对象 final类与final方法
May 05 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
基于PHP静态类的原罪详解
May 06 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
PHP实现将textarea的值根据回车换行拆分至数组
Jun 10 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 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用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
深入理解React中何时使用箭头函数
2017/08/23 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
部署Django到阿里云服务器教程示例
2020/06/03 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
物理专业大学生职业生涯规划书
2014/02/07 职场文书
社区健康教育实施方案
2014/03/18 职场文书
开展读书活动总结
2014/06/30 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
公司给客户的感谢信
2015/01/23 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
入学证明
2015/06/23 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
Golang日志包的使用
2022/04/20 Golang
Python使用openpyxl模块处理Excel文件
2022/06/05 Python