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(),然后执行魔术 你能举一个使用条令查询生成器的例子吗?这确实是个大问题。:)泰克斯想。