dynamodb表上的过滤

本文关键字:过滤 dynamodb | 更新日期: 2023-09-27 17:50:15

我有一个表说位置下面的指令

|位置(Hashkey-String) |时间戳(Range-Numeric) | # visiting_Person |

现在我想要得到两个时间戳之间的所有访问人员

Table myTable= Table.LoadTable(client, "tableName");
QueryFilter filter = new QueryFilter();
filter.AddCondition("TimeStamp", QueryOperator.GreaterThan, 56545454);
Search search = myTable.Query(filter);

但是会抛出错误-

查询条件缺少模式元素:Location

从错误看来,我必须在过滤器中添加位置(因为它是哈希键),但我不必对特定位置进行过滤,我必须在时间戳

内获得任何位置

我尝试将时间戳设置为hashkey,但我发现我们只能在hashkey上应用相等运算符。

在调试和使用其他方式更改时,我遇到了其他错误,即keycondition不能应用


我可以用scan做同样的事情,但是由于性能问题,我必须使用Query.


请告诉我怎样才能达到我想要的输出。

dynamodb表上的过滤

查询需要表的主键,所以没有办法只查询范围键。

基本上,由于DynamoDB基于散列键进行分区,而Query在分区内操作,因此您需要:

  1. 跨散列键扫描(通过并行扫描可以提高性能)
  2. 构造可用于查询的散列键。例如,如果范围是非任意的,你可以通过基于一些不太细粒度的时间为"bucket"创建一个属性并在其上构建一个GSI来提高性能:

    • 假设两个时间戳之间的最大范围是1天,您可以:
    • 创建一个日期级别粒度的属性(比如"TimeStampDate"),而不是日期+时间时间戳粒度。
    • 用TimeStampDate作为哈希键创建GSI
    • 对重叠查询时间范围的日期执行并行查询:"TimeStampDate=[开始时间戳日期]AND timestamp BETWEEN[开始时间戳/结束时间戳]","TimeStampDate=[开始时间戳日期+ 1天]AND timestamp BETWEEN[开始时间戳/结束时间戳]",等等。

我知道这在Cassandra(遵循Dynamo的设计)中不起作用。逻辑是,你必须指定"任何前面的键",例如,如果你有

<>之前+---------+---------+--------+| Col1 | Col2 | Value |+---------+---------+--------+|值1 |值1 | 123 ||值2 |值2 | 123 ||值3 |值4 | 123 |+---------+---------+--------+之前

必须指定Col1,然后才能通过Col2进行筛选,如果关键字是Col1 and Col2。在Cassandra中,Col1将指示记录位于集群环中的哪个db服务器上,Col2将是该特定服务器上该表中的列键。希望现在大家清楚了为什么在搜索查询中指定集群键是很重要的。

要解决这个问题,您有两个选择:

  • 将查询更改为通过Location
  • 添加另一个只有TimeStampVisitingPerson两列的表。这个想法是,你只是复制数据,这在nosql世界中是很好的