dynamoDB: How to query N elements starting at X index

自古美人都是妖i 提交于 2020-01-16 09:11:07

问题


I'm looking for examples of the code using python3, no links to the documentation. I havent found examples in the documentation.

I'm looking to query 2 elements with the category "red" starting at the ID 1.

This is my table:

| ID | category | description |
| 0  | red      | ....        |
| 1  | red      | ....        |
| 2  | blue     | ....        |
| 3  | red      | ....        |
| 4  | red      | ....        |

The query should return the elements with the id 1 and 3.

Looking forward to read your examples. Thanks in advance.


回答1:


In dynamo Db you query over your PartitionKey, LSIs or GSIs.

In your case I would create a GSI with its' partitionKey (gsiID) as your category and its' sortKey (gsiSK) as your ID.

In that case you can do a query like this: query all elements with gsiID = red and gsiSK = *

This will give you all the reds sorted by their ID in ascending order (you can also specify descending order)

Now dynamo queries have an option to limit your result. Since you need to you can do a limit = 2.

I hope this will help you!




回答2:


You need to define an Global secondary index in which the partition key is category and the sort key is id.

Once your have that index defined, you can query it as follows (I am using the JS notation, sorry):

{
  TableName: 'your_table_name',
  IndexName: 'your_index_name',
  KeyConditionExpression: 'category = :x and ID >= :y',
  ExpressionAttributeValues: {
    ':x': 'red',
    ':y': 1
  }
}

Note that this is a query. In DynamoDB, queries work on "chunks" of items (aka: "pages"). Specifically, when executing a query, DDB takes a chunk, finds all matching items in that chunks and returns them. If there are other matching items in other chunks they will not be returned. However, the response will provide you with details of the next chunk so that you can issue a subsequent query on the next chunk. These "details" are encapsulated in the LastEvaluatedKey field of the response and they should be copied into the ExclusiveStartKey of the subsequent request.

You can check this guide to see an example of using LastEvaluatedKey. Look for the following line:

while 'LastEvaluatedKey' in response:

Important!

Although you want to get just two items, you do not want to set the Limit field to 2. Setting it to 2 means that DynamoDB will use very small chunks when looking for items that match your query (in fact, it will use chunks of just two items): this means you will need to do numerous repeated queries (by using LastEvaluatedkey/ExclusiveStartKey as explained above) until you actually find two matching items. This will considerably slow down the entire process. For most practical scenarios, the best thing to do is not to set the Limit field at all, and just use its default value.



来源:https://stackoverflow.com/questions/57702153/dynamodb-how-to-query-n-elements-starting-at-x-index

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!