Discuz教程网

用php在MongoDB中模拟Auto Increment

[复制链接]
authicon dly 发表于 2011-3-8 17:48:28 | 显示全部楼层 |阅读模式
MySQL用户多半都有Auto Increment情结,不过MongoDB缺省并没有实现,所以需要模拟一下,编程语言以PHP为例
代码大致如下所示:
代码如下:

  1. <?php
  2. function generate_auto_increment_id($namespace, array $option = array())
  3. {
  4. $option += array(
  5. 'init' => 1,
  6. 'step' => 1,
  7. );
  8. $instance = new Mongo();
  9. $instance = $instance->selectCollection('_seq', 'seq');
  10. $seq = $instance->db->command(array(
  11. 'findAndModify' => 'seq',
  12. 'query' => array('_id' => $namespace),
  13. 'update' => array('$inc' => array('id' => $option['step'])),
  14. 'new' => true,
  15. ));
  16. if (isset($seq['value']['id'])) {
  17. return $seq['value']['id'];
  18. }
  19. $instance->insert(array(
  20. '_id' => $namespace,
  21. 'id' => $option['init'],
  22. ));
  23. return $option['init'];
  24. }
  25. var_dump(generate_auto_increment_id('foo'));
  26. var_dump(generate_auto_increment_id('bar', array('init' => 123)));
  27. ?>
复制代码


其具体实现方式主要是利用MongoDB中findAndModify命令,只要每次往MongoDB里insert对象前生成ID赋值给_id就OK了,因为它的实现满足原子性,所以不存在并发问题。
另外说明一点,findAndModify本身提供了一个upsert参数,为true的话可以自动insert,但那样就不能自定义初始值了,所以文中示例没有使用upsert。
BTW,数据库“_seq”的名字以下划线开头,这样列表的时候会排在前面,更容易分辨些。





上一篇:PHP数组交集的优化代码分析
下一篇:Discuz!7.2编号890105模板
authicon melody0721 发表于 2011-5-9 11:59:55 | 显示全部楼层
不错,我喜欢
authicon 夕梨二世 发表于 2011-5-10 10:59:53 | 显示全部楼层
支持楼主,顶一下
authicon fhiejkl 发表于 2011-5-14 23:59:39 | 显示全部楼层
不错不错,我喜欢
authicon kurt226 发表于 2011-5-19 21:59:58 | 显示全部楼层
好辛苦才找到啊
authicon 纤陌陌 发表于 2011-5-22 05:59:56 | 显示全部楼层
楼主真强大
authicon qqoxygen 发表于 2011-5-23 13:00:00 | 显示全部楼层
不错,我喜欢
authicon 丁加丁 发表于 2011-5-24 09:59:35 | 显示全部楼层
有意思~顶顶 ,继续顶顶。继续顶哦
authicon lilac_yao 发表于 2011-5-25 12:59:41 | 显示全部楼层
继续来索要
authicon 风中徜徉 发表于 2011-5-26 18:00:01 | 显示全部楼层
看帖必回
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-7 11:26

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表