我正在学习Dynamodb,为此我在http://localhost:8000/shell
安装了shell附带的本地服务器现在..我创建了下表:
var serverUpTimeTableName = 'bingodrive_server_uptime';
var eventUpTimeColumn = 'up_time';
var params = {
TableName: serverUpTimeTableName,
KeySchema: [ // The type of of schema. Must start with a HASH type, with an optional second RANGE.
{ // Required HASH type attribute
AttributeName: eventUpTimeColumn,
KeyType: 'HASH',
},
],
AttributeDefinitions: [ // The names and types of all primary and index key attributes only
{
AttributeName: eventUpTimeColumn,
AttributeType: 'N', // (S | N | B) for string, number, binary
},
],
ProvisionedThroughput: { // required provisioned throughput for the table
ReadCapacityUnits: 2,
WriteCapacityUnits: 2,
}
};
dynamodb.createTable(params, callback);
所以我创建了一个只有一个名为up_time的哈希键的表,它实际上是表中唯一的项目。
现在我想获取最后10次插入的时间。
到目前为止,我创建了以下代码:
var serverUpTimeTableName = 'bingodrive_server_uptime';
var eventUpTimeColumn = 'up_time';
var params = {
TableName: serverUpTimeTableName,
KeyConditionExpression: eventUpTimeColumn + ' != :value',
ExpressionAttributeValues: {
':value':0
},
Limit: 10,
ScanIndexForward: false
}
docClient.query(params, function(err, data) {
if (err) ppJson(err); // an error occurred
else ppJson(data); // successful response
});
好的......很少有事情需要注意:
Limit 10
作为限制,ScanIndexForward:false
作为逆序。 !=
或NE
。似乎我必须在查询中使用某种索引..对此感到困惑。所以..非常感谢有关这个问题的任何信息。
答案 0 :(得分:4)
一些现代术语:Hash现在称为Partition,Range现在称为Sort。
谢谢亚马逊。
您需要了解Query
- ing是对哈希键的操作。要启动查询,您必须提供哈希键。由于您的表的主键只是哈希键(而不是哈希值+范围),因此您无法查询它。您只能Scan
才能查找商品。扫描并不需要任何有关表中项目的知识。
继续......当你说"最后10项"你实际上想要一个条件,因为你正在过滤日期属性,你还没有定义任何索引,所以你不能让引擎为你提供10个结果。如果它是范围键元素,您可以通过使用向后索引(ScanIndexForward:false
)查询前10个有序元素 - 再次,而不是您的模式。
在您当前的表格中 - 您究竟想要做什么?您目前只有一个属性也是哈希键,所以10个项目看起来像(没有订单,没有重复):
12312
53453
34234
123
534534
3101
11
你可以将它们移动到范围键并拥有一个全局哈希键" stub"只是为了启动您正在进行的查询,但是由于您拥有热门分区而无法获得最佳性能,因此违反了DynamoDB的指导原则。目前还不确定这会让你烦恼,但值得一提的是。