在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
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
twig模板获取全局变量的方法
Feb 05 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
php中this关键字用法分析
2016/12/07 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
利用Python实现图书超期提醒
2016/08/02 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
元旦寄语大全
2014/04/10 职场文书
中国梦口号
2014/06/13 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书