Php 如何删除嵌入的文档

Php 如何删除嵌入的文档,php,mongodb,doctrine,Php,Mongodb,Doctrine,我正试图从这个结构中移除一个玩家 { "_id" : ObjectId( "51043d468ead0e0757000006" ), "active" : true, "created" : 1359232326, "difficulty" : 0, "map" : { "$ref" : "Map", "$id" : ObjectId( "5103c0228ead0e3764000000" ), "$db" : "fantasytd" }, "mode" :

我正试图从这个结构中移除一个玩家

{ "_id" : ObjectId( "51043d468ead0e0757000006" ),
  "active" : true,
  "created" : 1359232326,
  "difficulty" : 0,
  "map" : { "$ref" : "Map",
    "$id" : ObjectId( "5103c0228ead0e3764000000" ),
    "$db" : "fantasytd" },
  "mode" : "coop",
  "players" : [ 
    { "$ref" : "User",
      "$id" : ObjectId( "50d83abf038054b560000000" ),
      "$db" : "fantasytd" }, 
    { "$ref" : "User",
      "$id" : ObjectId( "50d83abf038054b560000000" ),
      "$db" : "fantasytd" }, 
    { "$ref" : "User",
      "$id" : ObjectId( "50d83abf038054b560000000" ),
      "$db" : "fantasytd" }, 
    { "$ref" : "User",
      "$id" : ObjectId( "50d83abf038054b560000000" ),
      "$db" : "fantasytd" } ],
 "title" : "testgame" }
我试过了

$db->createQueryBuilder()
        ->update()
        ->field('id')->equals($gameId)
        ->field('players.$id')->equals($userId)
        ->pull('players.$.assets')
        ->getQuery()
        ->execute();

但它不会起作用,可悲的是,Doctrine MongoDB的文档非常精简://

从技术上讲,由于阵列中的所有玩家都是相同的,所以应该这样做:

要删除列表中的最后一个播放机,请执行以下操作:

db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pop: {players: 1}})
db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pop: {players: -1}})
要删除列表中的第一个播放机,请执行以下操作:

db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pop: {players: 1}})
db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pop: {players: -1}})
(将“coll”替换为您的收藏名称)

但我认为这不是您想要的,因此我将添加更多的玩家,以便更容易看到事物何时消失:

db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$push: {players: {$ref: "User", $id: ObjectId("50d83abf038054b560000001")}}})
db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$push: {players: {$ref: "User", $id: ObjectId("50d83abf038054b560000002")}}})
db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$push: {players: {$ref: "User", $id: ObjectId("50d83abf038054b560000003")}}})
您可以使用此命令查看更改:

db.coll.find({_id: ObjectId("51043d468ead0e0757000006")}).pretty()
例如,要删除数组中的第三个播放器,可以先将播放器子文档设置为null,然后删除null:

db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$unset: {"players.3": 1}})
db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pull: {players: null}})
或者删除所有具有特定$ref和$id的玩家:

db.coll.update({_id: ObjectId("51043d468ead0e0757000006")}, {$pull: {players: {$ref: "User", $id: ObjectId("50d83abf038054b560000000")}}})

最后,我在游戏文档中创建了一个删除方法

  public function removePlayer($playerId)
  {
    foreach($this->players as $index => $player) {
      if($player->getId() == $playerId) {
        unset($this->players[$index]);
      }
    }
    return $this;
  }

调用此方法后,我只需执行一个flush(),然后执行魔术

你能举一个使用条令查询生成器的例子吗?这确实是个大问题。:)泰克斯想。