我正在尝试使用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();
这不会产生任何错误,也不会改变就绪状态。已调试此代码的每一位,并且所有值都有效。