Sua chave Hash (primária do tipo) deve ser única (a menos que você tenha um intervalo como o declarado por outros).
No seu caso, para consultar sua tabela, você deve ter um índice secundário.
| ID | DataID | Created | Data |
|------+--------+---------+------|
| hash | xxxxx | 1234567 | blah |
Sua chave Hash é o ID. Seu índice secundário é definido como: DataID-Created-index (esse é o nome que o DynamoDB usará)
Então, você pode fazer uma consulta como esta:
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
}
});
Basicamente, sua consulta é semelhante a:
SELECT * FROM TABLE WHERE DataID = "some_id" AND Created > timestamp;
O índice secundário aumentará as unidades de capacidade de leitura / gravação necessárias, portanto, você precisa considerar isso. Ainda é muito melhor do que fazer uma varredura, o que custará leituras e tempo (e é limitado a 100 itens, eu acredito).
Esta pode não ser a melhor maneira de fazer isso, mas para alguém acostumado com RD (também estou acostumado com SQL) é a maneira mais rápida de se tornar produtivo. Como não há restrições em relação ao esquema, você pode preparar algo que funcione e, uma vez que você tenha a largura de banda para trabalhar da maneira mais eficiente, pode mudar as coisas.
CreatedAt
mais de um determinado ponto.