.net DynamoDB排序键,以便可以按日期查询最后一项

13z8s7eq  于 2023-01-31  发布在  .NET
关注(0)|答案(1)|浏览(112)

下面的DynamoDB表有一个等于date的分区键,所以我可以很容易地每天查询。我知 prop 有相同分区键的项存储在相同的分区中,并按其排序键排序。
但是,本例中的排序键是错误的,因为TransferId不像是我可以排序的日期。
应使用哪个排序键才能查询特定日期的最后一项?“Exchange:Time”?

+----------+------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+---------------------------+----------------+--------------------------------------------------------------------+----------------------------------+--------------+------------------------------+
|    PK    |                    SK                    | Account |                  Address                   | AddressTag | Exchange | Instrument | Network | Quantity  |           Time            | TransactionFee |                           TransactionId                            |            TransferId            | TransferType |          UpdatedAt           |
+----------+------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+---------------------------+----------------+--------------------------------------------------------------------+----------------------------------+--------------+------------------------------+
| 20221217 | Binance:1b56485f6a3446c3b883f4f485039260 | main    | 0xF76d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | Binance  | USDT       | ETH     | 97.500139 | 2022-12-17T14:59:12+00:00 |            3.2 | 0x46d28f7d0e1e5b1d074a65dcfbb9d90b3bcdc7e6fca6b1f1f7abb5ab219feb24 | 1b56485f6a3446c3b883f4f485039260 |            0 | 2023-01-27T18:00:00.5930186Z |
| 20221217 | Binance:4747f6ecc74f4dd8a4b565e0f15bcf79 | main    | 0xF76d3f20bF155681b0b983bFC3ea5fe43A2A6E3c | null       | Binance  | USDT       | ETH     | 3107.4889 | 2022-12-17T15:38:23+00:00 |            3.2 | 0xbb2b92030b988a0184ba02e2e754b7a7f0f963c496c4e3473509c6fe6b54a41d | 4747f6ecc74f4dd8a4b565e0f15bcf79 |            0 | 2023-01-27T18:00:00.2944534Z |
+----------+------------------------------------------+---------+--------------------------------------------+------------+----------+------------+---------+-----------+---------------------------+----------------+--------------------------------------------------------------------+----------------------------------+--------------+------------------------------+

我想代码应该如下所示:

var date = DateTimeOffset.UtcNow.ToString("yyyyMMdd");

var request = new QueryRequest
{
    TableName = "transfers-dev",
    KeyConditionExpression = "#date = :date",
    ExpressionAttributeNames = new Dictionary<string, string> { { "#date", "PK" } },
    ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":date", new AttributeValue { S = date } } },
    ScanIndexForward = false,
    Limit = 1
};
var response = await client.QueryAsync(request);

return response.Items.First();
6uxekuva

6uxekuva1#

日期作为分区键不是很有用,它基本上将吞吐量限制在1000 WCU,而且也不能像give me the data for the last 18 hours那样提供查询灵活性。
您应该选择一些有用的东西作为分区键,并选择日期作为排序键。
| PK参数|SK|资料|gs_峰值|
| - ------|- ------|- ------|- ------|
| 币别:1b56485f6a3446c3b883|2022年12月17日14时59分12秒00秒00分|资料|1个|
| 币别:1b56485f6a3446c3b883|2022年12月18日14时59分12秒00秒00分|资料|1个|
| 币别:1b56485f6a3446c3b883|2022年12月19日14:59:12 + 00:00|资料|1个|
现在你可以说give me the all data for a giving binance in a giving time frame.如果你需要查找你想要的所有binance for last giving time,你可以创建一个GSI并使用一个随机或静态值作为分区键.你使用的键越多,你能够消耗的吞吐量就越大.
| gsi_峰值|SK|PK参数|资料|
| - ------|- ------|- ------|- ------|
| 1个|2022年12月17日14时59分12秒00秒00分|币别:1b56485f6a3446c3b883|资料|
| 1个|2022年12月17日14时59分12秒00秒00分|币别:1b56485f6a3446c3b883|资料|
| 1个|2022年1月26日14时59分12秒+00秒|币别:1b56485f6a3446c3b883|资料|

获取最新数据:

SELECT * FROM MYTABLE.MYINDEX WHERE gsi_pk = 1 DESC

获取给定日期的数据:

SELECT * FROM MYTABLE.MYINDEX WHERE gsi_pk = 1 AND SK BEGINS_WITH '26.01.2022'

备注

GSI分区键只有一个值也会限制可伸缩性,如果您打算每秒写入超过1000个条目(假设条目〈1KB),那么您必须对索引键进行分片。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-gsi-sharding.html

相关问题