Как сделать запрос AWS DynamoDb, используя KeyConditionExpression? - PullRequest
1 голос
/ 09 мая 2019

У меня есть таблица AWS DynamoDb,
У меня user_id в качестве индекса или GSI (user_id-index),
И у меня product_type также в качестве индекса или GSI (prod_type-index).

Я пытаюсь использовать KeyConditionExpression для запроса таблицы DynamoDb,
Но я получаю -

Validation Exception, with message:"Query key condition not supported" and statusCode: 400
ValidationException: Query key condition not supported\n at Request.extractError 

У меня есть следующая структура элементов в таблице -

{
  "id": "12345f9f-f08c-45ae-986a-f1b5ac712345",
  "user_id": 1234,
  "prod_type": "OTHER"
}

Ниже приведен мой код NodeJ для запросов к таблице -

let AWS = require('aws-sdk');

AWS.config.update({
    region: 'us-east-1'
});

let connection = new AWS.DynamoDB.DocumentClient();

let table = "some_table";

let params = {
    IndexName : "user_id-index",
    ExpressionAttributeValues: {
        ":v1": {
            N: 1234
        },
        ":v2": {
            S: "OTHER"
        }
    },
    ExpressionAttributeNames: {
        "#userId": "user_id",
        "#prodType": "prod_type"
    },
    TableName: table,
    KeyConditionExpression: "#userId = :v1 and #prodType = :v2"
};

connection.query(params, function(err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

Ссылки -
Ошибка запроса Dynamodb - условие ключа запроса не поддерживается
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Как я уже упоминал в предыдущем ответе.Вы не можете поместить хеш-ключ одного GSI / Primary и хеш-ключ другого GSI / Primary в один KeyConditionExpression

Условие должно выполнить тест на равенстводля одного ключа секционирования значение.

Условие может дополнительно выполнять один из нескольких сравнительных тестов для одного значения ключа сортировки.Это позволяет Query получать один элемент с заданным значением ключа раздела и значением ключа сортировки или несколько элементов, которые имеют одинаковое значение ключа раздела, но разные значения ключа сортировки.

из документов

Он не поддерживается DynamoDB и на самом деле экономит ваши деньги.Здесь вы можете использовать более конкретный хеш-ключ GSI в качестве KeyConditionExpression, тогда вы можете выполнить FilterExpression для набора результатов

В противном случае, установите GSI, который имеет одно из свойств, таких как Hash Key идругой как ключ диапазона.Таким образом, вы можете делать запросы, используя синтаксис

partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

Помните, что partitionKeyName поддерживает только равенство.sortKeyName поддерживает несколько различных операций

1 голос
/ 09 мая 2019

Согласно документации здесь , проблема заключается в том, что ваше ExpressionAttributeValues ​​ значение неверно.Вам необходимо предоставить отображение переменной и типа данных со значением.Вам необходимо предоставить сопоставление следующим образом:

let params = {
   IndexName : "user_id-index",
   ExpressionAttributeValues: {
      ":v1": {
           N: 1234
       },
       ":v2": {
           S: "OTHER"
       }
   },
   TableName: table,
   KeyConditionExpression: "user_id = :v1 and prod_type = :v2"
};

Вам необходимо указать тип данных в соответствии с документацией. S для строковых литералов, N для чисел и т. Д. Подробности можно найти в документации выше.Я также настоятельно рекомендую использовать ExpressionAttributeNames .Я обнаружил, что он работает лучше, и это лучший опыт с этим SDK.Вам необходимо заменить переменные, которые вы указали в отображении в KeyConditionExpression , примерно так:

let params = {
   IndexName : "user_id-index",
   ExpressionAttributeValues: {
       ":v1": {
           N: 1234
       },
       ":v2": {
           S: "OTHER"
       }
   },
   ExpressionAttributeNames: {
       "#userId": "user_id",
       "#prodType": "prod_type"
   }
   TableName: table,
   KeyConditionExpression: "#userId = :v1 and #prodType = :v2"
};

Ссылка -
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html

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