【问题标题】:Create index on nested array value with dynamodb使用 dynamodb 在嵌套数组值上创建索引
【发布时间】:2021-06-13 04:06:26
【问题描述】:

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

{
  "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 表之外,还有一个名为 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"
        ]
      }
    ]
  ]
}

【问题讨论】:

  • 索引(作为其分区和排序键的一部分)只能包含字符串、数字或二进制类型的顶级属性。因此,您不能让索引使用嵌套值。如果您按照建议创建一个新表,我不知道您想要什么样的排序,但请记住排序仅通过排序键完成,如上所述,它必须是上述类型的顶级属性.

标签: amazon-dynamodb dynamodb-queries amazon-dynamodb-index amazon-dynamodb-data-modeling


【解决方案1】:

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

因为听起来您确实拥有围绕结果的访问模式,所以最好将结果存储在它们自己的项目中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2020-05-14
    • 1970-01-01
    • 2020-11-23
    • 2017-03-08
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多