IT技术博客大学习 共学习 共进步

在MongoDB中模拟auto_increment

火丁笔记 2011-02-09 22:11:23 浏览 4,024 次

MySQL用户多半都有auto_increment情结,不过MongoDB缺省并没有实现,所以需要模拟一下,编程语言以PHP为例,代码大致如下所示:

<?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'));

?>

其具体实现方式主要是利用MongoDB中findAndModify命令,因为它的实现满足原子性,所以不存在并发问题。有了这个自增ID生成器,只要每次往MongoDB里insert对象前设置一下_id就OK了,如果有数据抽象层,可以在里面封装这个过程,便可实现透明性。

BTW,数据库“_seq”的名字以下划线开头,这样列表的时候会排在前面,更容易分辨些。

参考:Auto Increment with MongoDB

建议继续学习

  1. MongoDB与内存 (阅读 6,004)
  2. Nodejs和MongoDB初体验 (阅读 5,763)
  3. 白话MongoDB(一) (阅读 4,664)
  4. 我为什么选择MongoDB (阅读 4,663)
  5. MySQL和MongoDB设计实例对比 (阅读 4,522)
  6. 也来玩玩MongoDB (阅读 4,485)
  7. 记一次MongoDB性能问题 (阅读 4,082)
  8. MySQL Cluster 与 MongoDB 复制及分片设计及原理 (阅读 4,042)
  9. 白话MongoDB(二) (阅读 3,526)
  10. MySQL MongoDB SQL 对应 (阅读 3,405)