繁体   English   中英

在两个时间戳之间进行扫描\\查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM