0

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

{ "_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 的文档非常精简:/

4

2 回答 2

0

我最终在我的游戏文档中创建了一个删除方法。

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

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

于 2013-01-27T21:48:31.933 回答
0

从技术上讲,由于数组中的所有玩家都是相同的,因此应该这样做:

要删除列表中的最后一个玩家:

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()

例如,要删除数组中的第 3 个播放器,您可以先将播放器子文档设置为 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")}}})
于 2013-01-27T12:01:01.160 回答