Doctrine を使用して埋め込みドキュメントを更新しようとしています。構造は次のようになります。
{ "_id" : ObjectId( "513a3e4a0380543b40000000" ),
"active" : true,
"created" : 1362771530,
"difficulty" : "Titan",
"map" : { "$ref" : "Map",
"$id" : ObjectId( "513631e4504a10f516b82ca7" ),
"$db" : "fantasytd" },
"mode" : "Coop",
"password" : "adasdasda",
"playerLimit" : 4,
"players" : [
{ "$ref" : "Guest",
"$id" : ObjectId( "5135c5300380549b03000001" ),
"$db" : "fantasytd" },
{ "$ref" : "Guest",
"$id" : ObjectId( "511fdc5f0380546d02000000" ),
"$db" : "fantasytd" } ],
"playerStates" : [
{ "id" : "5135c5300380549b03000001",
"ready" : false },
{ "id" : "511fdc5f0380546d02000000",
"ready" : false } ],
"title" : "adskmaskldmasdmklas" }
このコードを使用して、プレーヤーの準備完了状態を true に設定したいと思います。
$q = $this->get('doctrine_mongodb')
->getRepository('FantasytdGameBundle:Game')
->createQueryBuilder()
->hydrate(false)
->update()
->field('id')->equals($id);
$update = $paramFetcher->get('update');
if($update == 'ready') {
$session = new Session();
$session->start();
// Load player using accesstoken.
$player = $session->get($paramFetcher->get('accesstoken'));
// Set player to be ready, if exist.
$q->field('playerStates.id')->equals($player->getId());
$q->field('playerStates.ready')->set('true');
}
$q->getQuery()->execute();
これによりエラーは発生せず、準備完了状態も変更されません。このコードのすべてのビットをデバッグしており、すべての値が有効です。