使用 dynamodb 在嵌套数组值上创建索引

Create index on nested array value with dynamodb

我将以下数据存储在名为 elo-history 的 DynamoDB table 中。

{
  "gameId": "chess",
  "guildId": "abc123",
  "id": "c3c640e2d8b76b034605d8835a03bef8",
  "recordedAt": 1621095861673,
  "results": [
    {
      "oldEloRating": null,
      "newEloRating": 2010,
      "place": 1,
      "playerIds": [
        "abc1"
      ]
    },
    {
      "oldEloRating": null,
      "newEloRating": 1990,
      "place": 2,
      "playerIds": [
        "abc2"
      ]
    }
  ],
  "versus": "1v1"
}

我有 2 个索引,guildId-recordedAt-indexgameId-recordedAt-index。这些允许我查询这些字段。

我正在尝试为 results[].playerIds[] 添加另一个索引。我希望能够使用 playerId=abc1 查询记录,并像 guildId 和 gameId 一样对这些记录进行排序。 DynamoDB 是否支持类似的东西?我是否需要重组数据或以两种不同的格式保存数据以支持此类查询?

像这样。 除了 elo-history table 之外,新的 table 称为 player-elo-history。这将按 playerId

存储游戏列表
{
  "id": "abc1",
  "gameId": "chess",
  "guildId": "abc123",
  "recordedAt": 1621095861673,
  "results": [
    [
      {
        "oldEloRating": null,
        "newEloRating": 2010,
        "place": 1,
        "playerIds": [
          "abc1"
        ]
      },
      {
        "oldEloRating": null,
        "newEloRating": 1990,
        "place": 2,
        "playerIds": [
          "abc2"
        ]
      }
    ]
  ]
}
{
  "id": "abc2",
  "gameId": "chess",
  "guildId": "abc123",
  "recordedAt": 1621095861673,
  "results": [
    [
      {
        "oldEloRating": null,
        "newEloRating": 2010,
        "place": 1,
        "playerIds": [
          "abc1"
        ]
      },
      {
        "oldEloRating": null,
        "newEloRating": 1990,
        "place": 2,
        "playerIds": [
          "abc2"
        ]
      }
    ]
  ]
}

看起来您正在使用游戏项上的复杂属性(例如列表或对象)对游戏和结果之间的一对多关系进行建模。这是一种完全有效的一对多关系建模方法,最适用于以下情况:1) 结果数据不改变(或经常改变)和 2) 您没有任何关于结果的访问模式。

由于听起来您确实 具有围绕结果的访问模式,您最好将结果存储在它们自己的项目中。

例如,您可能会考虑使用 PK=USER#user_id SK=RESULT#game_id 在用户分区中建模结果。这将允许您通过用户 ID 获取结果(QUERY where PK=USER#user_id SK begins_with RESULT)。或者,您可以使用 PK=RESULT#game_id SK=USER#user_id 对结果建模,并创建一个交换 PK/SK 的 GSI,这样您就可以按用户对结果进行分组。

我不知道您的访问模式的细节,但可以说,如果您想支持游戏结果的访问模式,您需要将结果移动到它们自己的项目中。