FuelPHPのMongoDBクラスで『_id』を条件にfindする
想定バージョン : 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' )); }