FuelPHP + mongoDB で auto increment


結構めんどくさかったので備忘録。

ユニークなIDだけなら自動生成される “_id”: ObjectId(“xxxxxx”) でもいいんですが、連番使いたい場面がどうしてもあるので。

まず連番用の collection を作ります。
(php 上でやってもいいけど、毎度データの有無判定はよくないかも)

# collection名は seq と仮定
# 連番を使いたい collection を test と仮定
db.seq.insert({"_id": "test", "autoID": 1});

# 数値を NumberLong型にしてるならこう
db.seq.insert({"_id": "test", "autoID": NumberLong("1")});

model で 連番を取得する関数を作ります。

public static function getIncrementNumber($collection){

        $mongo = \Mongo_Db::instance()

        $command = array(
                'findAndModify' => 'seq',
                'query' => array('_id' => $collection),
                'update' => array('$inc' => array(
                        'autoID' => 1
                )),
                'new' => true
        );

        $incID = $mongo->command($command);
        return $incID['value']['autoID'];
}

あとは document を insert するときに↑の関数を呼ぶだけ

$collection = 'test';

$document = array(
    'id'   => self::getIncrementNumber($collection),
    'name' => '山田太郎',
    'age'  => 20,
);

$mongo = \Mongo_Db::instance();
$mongo->insert("test", $document);

One Response to FuelPHP + mongoDB で auto increment

  1. 增达信购 より:

    博文值得拜读。受益了!

コメントを残す

メールアドレスが公開されることはありません。

Top