読者です 読者をやめる 読者になる 読者になる

FuelPHPのMongoDBクラスで『_id』を条件にfindする

FuelPHP MongoDB

想定バージョン : FuelPHP 1.4

MongoDBのドキュメントは『_id』というユニークなキーを持っています。

http://www.mongodb.org/pages/viewpage.action?pageId=7831684

『_id』については、上記公式サイトに詳しい説明が載っていますが、
通常、下記のように、12バイトの値が自動割り振られます。

> db.hoge.insert({name:"test1"})
> db.hoge.find()
{ "_id" : ObjectId("50ebba320296f684bea7c51f"), "name" : "test1" }

割り振られるのが、オブジェクトID用の特別なBSONデータタイプの為、
検索時、値をそのまま渡してしまうと、何もひっかかりません。

// ひっかからない
> db.hoge.find({_id:"50ebba320296f684bea7c51f"})

// ひっかかる
> db.hoge.find({_id:ObjectId("50ebba320296f684bea7c51f")})
{ "_id" : ObjectId("50ebba320296f684bea7c51f"), "name" : "test1" }

これはFuelPHPのMongoDBクラスでも同じです。

<?php
...
    $mongo = \Mongo_Db::instance();
    print_r($mongo->get_where('hoge', array('_id' => '50ebba320296f684bea7c51f')));

    /* [結果]
     *   Array
     *   (
     *   )
     */

で、本題の『_id』をピンポイントで取得する方法ですが、
FuelPHPのMongoDBクラスには、これ用の関数が用意されていない為、
PECL mongoのMongoIdを使用します。

<?php
...
    $mongo = \Mongo_Db::instance();
    print_r($mongo->get_where('hoge', array('_id' => new \MongoId('50ebba320296f684bea7c51f'))));

    /* [結果]
     *   Array
     *   (
     *     [0] => Array
     *       (
     *         [_id] => MongoId Object
     *           (
     *             [$id] => 50ebba320296f684bea7c51f
     *           )
     *
     *         [name] => test1
     *       )
     *   )
     */

ちなみに、MongoDBクラスで取得した『_id』は、
以下のようにそのまま使用可能です。

<?php
...
    $mongo = \Mongo_Db::instance();
    $hoge_list = $mongo->get('hoge');
    foreach ($hoge_list as $hoge) {
        $mongo->where(array('_id' => $val['_id']))->update('hoge', array(
            'name' => 'test2'
        ));
    }