AWS Dynamodb 查询与分区键异步

AWS Dynamo DB query async with partition key

我们正在使用 dynamo 数据库扫描功能来像这样从 dynamo 获取所有数据并且它工作正常:

var myScanConditions = new List<ScanCondition>();
myScanConditions .Add(new ScanCondition("PartitionKey", ScanOperator.BeginsWith, "data"));
var myData= await Context.ScanAsync(myScanConditions ).GetRemainingAsync();
//some code to filter some data from above

在我们的 dynamo db 分区键中就像

data#rec1
data#rec2
data#rec3
and so on

我想检查一下我们是否可以用查询替换扫描。我尝试通过将扫描条件传递给查询来使用下面的代码,但看起来它不正确。 return对我来说没什么。

var myData= await Context.QueryAsync("data", myScanConditions );

所以我的问题是有一个选项可以为 QueryAsync 方法提供分区键的部分文本,并且仍然 return 来自 dynamo 的所有记录。例如在我上面的例子中,如果我只是将“data”(部分文本)传递给我的异步查询。

有办法吗?

谢谢

很遗憾,您无法使用查询来搜索分区键。查询需要且仅支持分区键上的相等运算符。

如果您确实需要搜索 table 中的所有记录,那么您必须执行扫描,因为这正是扫描的目的,尽管检查所有数据是有代价的。

需要考虑的一些想法:

  • 如果您可以排除一些数据或将搜索重点放在数据集中另一个字段定义的特定类别上,则可以将全球二级索引 (GSI) 添加到您的 table 中,该索引使用不同的字段作为分区键和当前分区键作为排序键。然后您可以在 GSI 上执行查询,这将使您更灵活地搜索排序键。
  • 您还可以创建一个 GSI,其中只包含分区键而不包含其他 fields/columns。如果您随后将此 GSI 用于扫描,它将提高扫描的性能和成本,因为只有单个键列是 searched/loaded 而不是整个 table。获得结果后,您将需要在 table 上执行 GetItem 或 BatchGetItem 以提取完整记录(如果需要)。

参考文献:

  • What is the difference between scan and query in dynamodb? When use scan / query?

您必须有复合(散列键+排序键)主键才能使用查询。

如果您将“data”作为散列(分区)键,将 rec1、rec2、rec3 作为排序键,那么您可以仅使用“data”进行查询。