Ваш хеш-ключ (первичный для сортировки) должен быть уникальным (если у вас нет диапазона, как указано другими).
В вашем случае для запроса вашей таблицы у вас должен быть вторичный индекс.
| ID | DataID | Created | Data |
|------+--------+---------+------|
| hash | xxxxx | 1234567 | blah |
Ваш хеш-ключ - это идентификатор. Ваш вторичный индекс определяется как: DataID-Created-index (это имя, которое будет использовать DynamoDB)
Затем вы можете сделать такой запрос:
var params = {
TableName: "Table",
IndexName: "DataID-Created-index",
KeyConditionExpression: "DataID = :v_ID AND Created > :v_created",
ExpressionAttributeValues: {":v_ID": {S: "some_id"},
":v_created": {N: "timestamp"}
},
ProjectionExpression: "ID, DataID, Created, Data"
};
ddb.query(params, function(err, data) {
if (err)
console.log(err);
else {
data.Items.sort(function(a, b) {
return parseFloat(a.Created.N) - parseFloat(b.Created.N);
});
// More code here
}
});
По сути, ваш запрос выглядит так:
SELECT * FROM TABLE WHERE DataID = "some_id" AND Created > timestamp;
Вторичный индекс увеличит требуемые единицы емкости чтения / записи, поэтому вам нужно это учитывать. Это по-прежнему намного лучше, чем сканирование, которое требует больших затрат по чтению и по времени (и, как мне кажется, ограничивается 100 элементами).
Возможно, это не лучший способ сделать это, но для тех, кто привык к RD (я также привык к SQL), это самый быстрый способ стать продуктивным. Поскольку в отношении схемы нет ограничений, вы можете создать что-то, что работает, и как только у вас появится пропускная способность для работы наиболее эффективным способом, вы можете все изменить.
CreatedAt
точкой больше определенной.