Khóa băm của bạn (chính của loại) phải là duy nhất (trừ khi bạn có một phạm vi như những người khác đã nêu).
Trong trường hợp của bạn, để truy vấn bảng của bạn, bạn nên có một chỉ mục phụ.
| ID | DataID | Created | Data |
|------+--------+---------+------|
| hash | xxxxx | 1234567 | blah |
Khóa băm của bạn là ID Chỉ mục phụ của bạn được định nghĩa là: DataID-Created-index (đó là tên mà DynamoDB sẽ sử dụng)
Sau đó, bạn có thể thực hiện một truy vấn như sau:
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
}
});
Về cơ bản truy vấn của bạn trông giống như:
SELECT * FROM TABLE WHERE DataID = "some_id" AND Created > timestamp;
Chỉ số phụ sẽ tăng đơn vị khả năng đọc / ghi theo yêu cầu nên bạn cần cân nhắc điều đó. Nó vẫn tốt hơn rất nhiều so với quét, sẽ tốn kém về thời gian và thời gian đọc (và tôi tin rằng giới hạn trong 100 mục).
Đây có thể không phải là cách tốt nhất để làm điều đó nhưng đối với một người đã từng sử dụng RD (tôi cũng đã quen với SQL) thì đó là cách nhanh nhất để làm việc hiệu quả. Vì không có ràng buộc nào liên quan đến lược đồ, bạn có thể tạo ra một thứ gì đó hoạt động và một khi bạn có băng thông để làm việc theo cách hiệu quả nhất, bạn có thể thay đổi mọi thứ.
CreatedAt
lớn hơn một điểm nhất định.