在打字稿中使用 aws-sdk/lib-dynamodb getall

getall with aws-sdk/lib-dynamodb in typescript

我关于口袋妖怪的数据库有这个模式:

id: pikachu (pokemon的名字), content: Pokemon (object), height: 3

我想要获得最大高度的宠物小精灵,为此我想获得我数据库中的所有宠物小精灵,然后“减少”数组以获得最大的。

我正在使用这个 aws 库:@aws-sdk/lib-dynamodb

如何创建 QueryCommand 来获取所有值?我不需要任何 KeyConditions,但 AWS 说我必须包含它们。

  new QueryCommand({
    TableName: this.tableName,
  }),
);
const array =
  response?.Items?.map(
    item =>
      new PokemonDB({
        pokemon: item.content,
        height: item.height,
      }),
  ) ?? [];

const max = array.reduce(function (prev, current) {
  return prev.height > current.height ? prev : current;
});

return max.height;

错误是:

ValidationException: Either the KeyConditions or KeyConditionExpression parameter must be specified in the request.

DynamoDB 从根本上说是一个 key/value 数据库。所有操作都必须提供 hash/partition 键 (PK),以及可选的排序键。不提供 PK 就无法有效地查询所有项目,因为您必须求助于完整的 table 扫描才能实现。

通常,Dynamo 中的数据建模使用通常称为“单一 table 设计”的内容。所以,你可以有一个看起来像这样的 table:

PK SK myVal
user_123_friends friend_456 x
user_123_friends friend_789 y
user_456_friends friend_123 z

在此设置中,您可以使用 PK user_123_friends 进行查询,然后说 SK 应以 friend_ 开头,以列出用户 123 的所有好友,而无需求助于东西像完整 table 扫描等

因此,更一般地说,您通常最终会存储“规范化”数据,即在您的 table(s) 中以各种方式多次存储内容。您存储内容的方式完全取决于您的访问模式。

我可以推荐 Rick Houlihan 的这个演讲,以了解使用 Dynamo 进行数据建模的复杂性:) https://www.youtube.com/watch?v=HaEPXoXVf2k