Извлечение строк из DynamoDB из Lambda на основе первичного ключа?

Ниже приведен код моей лямбда-функции. У меня возникают проблемы с запросом строк на основе временных меток. Мой план состоит в том, чтобы получить все строки от 5 секунд до текущего времени до текущего времени в миллисекундах. TimeMillis(Number) хранит текущее время в миллисекундах и является первичным ключом, а ключ диапазона — PhoneId(String). Помогите, пожалуйста, с решением или можно как-то решить проблему?

Я не могу получить вывод, выдает ошибку.

'use strict';

var AWS = require("aws-sdk");
AWS.config.update({
region: "us-east-1",
});
var docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {

var timemillis = new Date().getTime();
var timemillis1 = timemillis - 5000;

var params = {
    TableName: 'Readings',
    KeyConditionExpression:  "TimeMillis = :tm and TimeMillis BETWEEN :from AND :to",
    ExpressionAttributeValues:  {
        ":tm"   : "TimMillis",
        ":from" : timemillis1,
        ":to"   : timemillis
    }
};

docClient.query(params, function(err, data)   {
   if(err){
       callback(err, null);
   } 
   else{
       callback(null, data);
   }
});
};

Вот мое изображение таблицы DynamoDB.

введите здесь описание изображения


person g anudeep reddy    schedule 24.07.2017    source источник
comment
Какую ошибку вы получаете??   -  person Rumesh Eranga Hapuarachchi    schedule 25.07.2017
comment
Показана ошибка: _"errorMessage": "KeyConditionExpressions must only contain one condition per key"_   -  person g anudeep reddy    schedule 25.07.2017
comment
Если я заменю приведенный выше код следующим: KeyConditionExpression: "TimeMillis BETWEEN :from AND :to", ExpressionAttributeValues: { ":from" : timemillis1, ":to" : timemillis } . Показана ошибка: **"errorMessage": "Query key condition not supported"**   -  person g anudeep reddy    schedule 25.07.2017
comment
Есть ли какое-либо решение для использования и получения строк с использованием условия BETWEEN для первичного ключа, в данном случае TimeMillis, или можете ли вы предложить какое-либо альтернативное решение, если это возможно, для преодоления эта ситуация?   -  person g anudeep reddy    schedule 25.07.2017
comment
я добавил ответ   -  person Rumesh Eranga Hapuarachchi    schedule 25.07.2017


Ответы (1)


Вы не можете иметь несколько условий внутри KeyConditionExpression. Что вы можете сделать, так это использовать FilterExpression с KeyConditionExpression, чтобы сузить набор результатов.

Цитата из документации,

Используйте параметр KeyConditionExpression, чтобы указать конкретное значение ключа секции. Операция запроса вернет все элементы из таблицы или индекса с этим значением ключа секции. При необходимости вы можете сузить область операции Query, указав значение ключа сортировки и оператор сравнения в KeyConditionExpression. Для дальнейшего уточнения результатов запроса можно дополнительно указать выражение фильтра. Выражение фильтра определяет, какие элементы результатов должны быть вам возвращены. Все остальные результаты отбрасываются.

Также для теста поддерживается только тест на равенство для ключа раздела. Другие условия могут применяться к ключу сортировки.

partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

Другой способ — создать GSI, который поддерживает дальнейшие запросы. Между прочим, традиционное мышление РСУБД не будет работать лучше всего с DynamoDB. О передовом опыте можно прочитать здесь.

person Rumesh Eranga Hapuarachchi    schedule 25.07.2017