[英]scan\query between two timestamps
我正在使用Aws-SDK為DynamoDB編寫一個nodejs 5.7.1應用程序。
我有一個使用以下代碼創建的事件表:
var statsTableName='bingodrive_statistics';
var eventNameColumn = 'event_name';
var eventTimeColumn = 'event_time';
var eventDataColumn = 'event_data';
var params = {
TableName: statsTableName,
KeySchema: [ // The type of of schema. Must start with a HASH type, with an optional second RANGE.
{ // Required HASH type attribute
AttributeName: eventNameColumn,
KeyType: 'HASH',
},
{ // Optional RANGE key type for HASH + RANGE tables
AttributeName: eventTimeColumn,
KeyType: 'RANGE',
}
],
AttributeDefinitions: [ // The names and types of all primary and index key attributes only
{
AttributeName: eventNameColumn,
AttributeType: 'S', // (S | N | B) for string, number, binary
},
{
AttributeName: eventTimeColumn,
AttributeType: 'N'
}
],
ProvisionedThroughput: { // required provisioned throughput for the table
ReadCapacityUnits: 1,
WriteCapacityUnits: 1,
}
};
dynamodbClient.createTable(params, callback);
如您所見,我有一個Hash + Range索引。 范圍是在event_time上。
現在,我想掃描或查詢兩個特定日期之間的所有項目。
因此,我將以下參數發送到dynamoDb的查詢功能:
{
"TableName": "bingodrive_statistics",
"KeyConditionExpression": "event_time BETWEEN :from_time and :to_time",
"ExpressionAttributeValues": {
":from_time": 1457275538691,
":to_time": 1457279138691
}
我收到此錯誤:
{
"message": "Query condition missed key schema element",
"code": "ValidationException",
"time": "2016-03-06T15:46:06.862Z",
"requestId": "5a672003-850c-47c7-b9df-7cd57e7bc7fc",
"statusCode": 400,
"retryable": false,
"retryDelay": 0
}
我是dynamoDb的新手。 我不知道最好的方法是“掃描”還是“查詢”。 任何有關此問題的信息將不勝感激。
您應該使用query
。 如果要查詢兩個范圍鍵之間的值,則不能僅使用范圍鍵,因為范圍鍵也需要使用哈希鍵。 這是因為哈希鍵(分區鍵)用於選擇存儲數據的物理分區,並按范圍鍵(排序鍵)進行排序。 從DynamoDB開發人員指南 :
如果表具有復合主鍵(分區鍵和排序鍵),則DynamoDB以與數據分發:分區鍵中所述相同的方式計算分區鍵的哈希值,但是它存儲具有相同分區鍵的所有項目值在物理上靠在一起,並按排序鍵值排序。
另外,您應該選擇分區鍵,以很好地分配數據。 如果evenName的值總數很小,則可能不是最佳選擇(請參見表准則 )
就是說,如果您已經有eventName
作為您的哈希鍵和eventTime
作為您的范圍鍵,則應該進行查詢(對不起,偽代碼,我通常使用DynamoDBMapper ):
hashKey = name_of_your_event
conditions = BETWEEN
attribute_values (eventTime1, eventTime2)
您不需要額外的本地二級索引或全局二級索引 。 請注意,GSI讓您查詢未使用表哈希和范圍鍵索引的列,但要查詢時間戳之間的數據,您仍將需要范圍鍵,否則將需要執行掃描 。
使用此查詢
function getConversationByDate(req , cb) {
var payload = req.all; //05/09/2017
var params = {
TableName: "message",
IndexName: "thread_id-timestamp-index",
KeyConditionExpression: "#mid = :mid AND #time BETWEEN :sdate AND :edate",
ExpressionAttributeNames: {
"#mid": "thread_id",
"#time": "timestamp"
},
ExpressionAttributeValues: {
":mid": payload.thread_id,
":sdate": payload.startdate,
":edate": payload.enddate
}
};
req.dynamo.query(params, function (err, data) {
cb(err, data);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.