как написать aws фильтр сканирования Dynamodb - PullRequest
0 голосов
/ 14 марта 2020

У меня есть одна таблица DynamodB, и одна запись похожа на belwo:

{
    "Items": [
        {
            "toObjectId": {
                "S": "5678"
            },         
            "keyValue": {
                "S": "7890"
            },
            "aTypeId": {
                "S": "test"
            },
            "aws:rep:deleting": {
                "BOOL": false
            },
            "currentAt": {
                "N": "1582476260000"
            },
            "keyTypeId": {
                "S": "test2"
            },
            "aId": {
                "S": "1234"
            },
            "aTypeId_keyTypeId_keyValue_currentAt": {
                "S": "test_test2_7890_1582476260000"
            },
            "fromObjectId": {
                "S": "12345"
            },

        }
    ],
    "Count": 2562,
    "ScannedCount": 2562,
    "ConsumedCapacity": null

}

Как мне написать один aws фильтр сканирования / запроса DynamodB с aws cli, чтобы просто получить aTypeId и aId при aTypeId такое "тест"? И

Primary partition key is aId (String)
Primary sort key is aTypeId_keyTypeId_keyValue_currentAt (String) 

Я пробовал ниже, но не повезло с этим

aws dynamodb query \
    --table-name test \
    --key-condition-expression "aTypeId = :aTypeId" \
    --expression-attribute-values '{
        ":aTypeId": { "S": "test" }     
    }' 

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Ваше поле не в ключе или GSI (Глобальный вторичный индекс), тогда я думаю, что вы должны использовать метод scan, чтобы получить объект по aTypeId,

Запрос будет выглядеть так:

aws dynamodb scan \
     --table-name test \
     --filter-expression "aTypeId = :typeValue" \
     --projection-expression "aTypeId, aId" \
     --expression-attribute-values '{":typeValue":{"S":"test"}}'

Если вы возвращаете результат со значением LastEvaluatedKey, это означает, что вам нужно выполнить один или несколько запросов для получения всех данных:

aws dynamodb scan \
     --table-name test \
     --filter-expression "aTypeId = :typeValue" \
     --projection-expression "aTypeId, aId" \
     --starting-token VALUE_NEXT_TOKEN_OF_LAST_QUERY \
     --expression-attribute-values '{":typeValue":{"S":"test"}}'

Но я рекомендовал создать GSI с aTypeId есть га sh ключ будет лучше.

0 голосов
/ 19 марта 2020

Поскольку aId является первичным ключом, и вы пытаетесь найти его, вы можете только сканировать таблицу (что может быть очень дорогой операцией). Попробуйте выполнить следующую команду для сканирования элемента

aws dynamodb scan \
 --table-name test \
 --projection-expression "aTypeId, aId" \
 --filter-expression "aTypeId = :aTypeId" \
 --expression-attribute-values '{":aTypeId":{"S":"test"}}'

. В качестве меры предосторожности один запрос Scan вернет данные размером до 1 МБ. Если данные для сканирования больше не нужны, к ответу на запрос добавляется LastEvaluatedKey, и это говорит о том, что вам необходимо выполнить Scan запрос еще раз, чтобы найти элемент, но на этот раз с --starting-token и значением будет точно LastEvaluatedKey

Если этот тип операции в вашем случае является рутиной, будет лучше использовать Global Secondary Index и использовать aTypeId в качестве первичного ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...