MongoId の詳細

ドキュメント ID からスカラ値を取得する

MongoDB のドキュメント ID ("_id" フィールド) はスカラ値ではなく \MongoDB\BSON\ObjectID クラスのインスタンスである、ということを記憶してください。 実際の Mongo ID 文字列を取得するためには、\MongoDB\BSON\ObjectID インスタンスを文字列に型キャストしなければなりません。

$query = new Query;
$row = $query->from('customer')->one();
var_dump($row['_id']); // "object(\MongoDB\BSON\ObjectID)" が出力される
var_dump((string) $row['_id']); // "string 'acdfgdacdhcbdafa'" が出力される

このことは、非常に役に立つこともありますが、しばしば問題を発生させます。 URL を作成したり、"_id" を他のストレージに保存しようとしたりする場合に、問題が生じます。 そのような場合には、\MongoId を文字列に変換することを忘れないでください。

/* @var $this yii\web\View */
echo $this->createUrl(['item/update', 'id' => (string) $row['_id']]);

MongoDB に保存されるユーザ・アイデンティティを実装する場合にも、同じ事があてはまります。 認証プロセスが働くようにするためには、\yii\web\IdentityInterface::getId() を実装するときに \MongoDB\BSON\ObjectID クラスをスカラ値に型キャストしなければなりません。

スカラ値からドキュメント ID を取得する

検索条件を構築する際には、'_id' キーの値は、単純な文字列である場合でも、 自動的に \MongoDB\BSON\ObjectID インスタンスにキャストされます。 従って、文字列で表された '_id' をあなたがキャストして戻す必要はありません。

use yii\web\Controller;
use yii\mongodb\Query;

class ItemController extends Controller
{
    /**
     * @param string $id MongoId 文字列 (オブジェクトではない)
     */
    public function actionUpdate($id)
    {
        $query = new Query();
        $row = $query->from('item')
            ->where(['_id' => $id]) // [[\MongoDB\BSON\ObjectID]] へ暗黙に型キャスト
            ->one();
        ...
    }
}

ただし、\MongoDB\BSON\ObjectID を含む他のカラムがある場合は、型キャストが必要になるかもしれない可能性について、 あなた自身が面倒を見なければなりません。