如何根据另一个人的条件从子文档中删除?

时间:2017-11-01 00:21:02

标签: mongodb mongodb-query

我正在开发计算机卡片游戏,并正在构建服务器组件,这将允许玩家创建和设计一个套牌。我使用的是使用Mongo作为数据存储的GameSparks。

当玩家推送“Save Deck”并将描述她刚建立的牌组的json文档发送给服务器时,我想在服务器上验证玩家实际上拥有她所拥有的所有牌。我需要一种方法来获取这个JSON文档并从中移除任何实际上不属于该播放器的卡片。

让事情变得复杂 - 玩家可以“摧毁”牌以获得“灰尘”,并且我需要在那时运行相同的支票以移除任何仍然在她的任何套牌中找到的卡的实例。

使用Mongo的查询引擎有没有办法做到这一点?我来自SQL Server背景,这样的东西似乎更容易。如果没有,我应该循环通过JSON并一次删除一张卡吗?

这是PlayerDeck文档:(它包含一个“DeckEntries”列表,其中有一个“id”代表卡的ID)

{
  "_id": {
    "$oid": "59f909269283f4cbf81a6e53"
  },
  "DeckID": "f36edf2d-7f76-4c58-8fcb-c5b273f65429",
  "DeckName": "New",
  "DeckEntries": [
    {
      "Id": "597f73ae46e0fb0001b8661d",
      "SlotPosition": 0
    },
    {
      "Id": "597f73ae46e0fb0001b865f3",
      "SlotPosition": 1
    }
  ],
  "HasOverriden": false,
  "PlayerID": "59ee3def5c3fba050ede62dc"
}

以下是PlayerCards文档:(它包含一个“卡片”子文档,其中包含代表卡ID的ID列表,以及表示玩家所拥有卡数的“计数”) p>

    {
  "_id": {
    "$oid": "59ee3def5c3fba050ede62e9"
  },
  "playerId": "59ee3def5c3fba050ede62dc",
  "dust": 12,
  "cards": [
    {
      "id": "597f73ae46e0fb0001b8660f",
      "count": 3
    },
    {
      "id": "597f73ae46e0fb0001b86602",
      "count": 0
    },
    {
      "id": "597f73ae46e0fb0001b8661d",
      "count": 1
    }
  ]
}

在此示例中,播放器正在尝试保存包含2张卡片的卡片,卡片ID为“597f73ae46e0fb0001b8661d”,卡片ID为“597f73ae46e0fb0001b865f3”。

在此示例中,玩家拥有2张牌“597f73ae46e0fb0001b8661d”和“597f73ae46e0fb0001b8660f”。

所以在这种情况下,玩家试图将1张牌保存到他实际上并不拥有的牌组(“597f73ae46e0fb0001b865f3”)。

如何从ID为“597f73ae46e0fb0001b865f3”的DeckEntries中删除该项目,因为它在PlayerDeck文档中不存在? (如果它确实存在于PlayerDeck中,我也需要删除,但关联的“计数”是0)

如何从'PlayerDeck'中移除任何不再属于(或数量为0)的牌卡?

0 个答案:

没有答案