在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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 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/20 PHP
PHP n个不重复的随机数生成代码
2009/06/23 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
限制文本字节数js代码
2007/03/06 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
Django中的CBV和FBV示例介绍
2018/02/25 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
军训考核自我鉴定
2014/02/13 职场文书
汉语言文学职业规划
2014/02/14 职场文书
青春寄语大全
2014/04/09 职场文书
党校毕业心得体会
2014/09/13 职场文书
委托书的写法
2014/09/16 职场文书
业务员岗位职责
2015/02/03 职场文书
护林员个人总结
2015/03/04 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
财务年终工作总结大全
2019/06/20 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
Html5新增了哪些功能
2021/04/16 HTML / CSS