ハッシュキー(主な種類)は一意である必要があります(他の人が述べたような範囲がない限り)。
あなたのケースでは、テーブルをクエリするには、セカンダリインデックスが必要です。
| ID | DataID | Created | Data |
|------+--------+---------+------|
| hash | xxxxx | 1234567 | blah |
ハッシュキーはIDです。セカンダリインデックスは次のように定義されます: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
、特定のポイントを超えるすべてのレコードをクエリすることはできません。