2016-03-13 49 views
0

我學習Dynamodb和我裝,現在在http://localhost:8000/shell查詢在dynamodb殼近10項

帶有一個殼本地服務器..我創建瞭如下表:

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 

}); 

確定..這麼幾件事情需要注意:

  1. 我並不真的需要一個KeyCondition。我只想要最後10個項目,所以我使用Limit 10作爲極限,ScanIndexForward:false作爲相反順序。
  2. !=NE在哈希鍵的鍵表達式不支持。似乎我必須在查詢中使用某種索引..困惑於此。

所以..關於這個問題的任何信息,將不勝感激。

回答

3

一些現代的術語:散列現在被稱爲分區,範圍現在被稱爲排序。
謝謝亞馬遜。

你要明白,Query -ing是哈希鍵的作用。爲了啓動一個查詢,你必須提供一個散列鍵。由於你的表的主鍵只是散列鍵(而不是散列+範圍),所以你不能查詢它。你只能用Scan它才能找到物品。掃描不需要任何有關表中項目的知識。

談完..當你說:「過去的10項」你其實需要一個條件,因爲你是在日期屬性過濾,您還沒有定義任何索引,所以你不能有引擎爲您提供10個結果。如果它是範圍關鍵元素,則可以通過向後索引(ScanIndexForward:false)查詢來獲得前10個有序元素 - 而不是您的模式。

在你當前的表格中 - 你究竟想要做什麼?您目前只有一個屬性,這也是哈希鍵,10個項目看起來像(無秩序,無重複):

12312 
53453 
34234 
123 
534534 
3101 
11 

您可以移動那些範圍鍵,並有一個全球性的哈希鍵「存根」只是爲了啓動您正在進行的查詢,但是由於您擁有熱分區,因此違反了DynamoDB的準則,因此無法獲得最佳性能。不知道這會讓你困擾,但值得一提的是。