Node.js 在两个时间戳之间扫描\查询
我正在使用aws sdk为DynamoDB编写一个nodejs 5.7.1应用程序 我有一个使用以下代码创建的事件表:Node.js 在两个时间戳之间扫描\查询,node.js,amazon-web-services,amazon-dynamodb,Node.js,Amazon Web Services,Amazon Dynamodb,我正在使用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: statsTab
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);
如您所见,我有一个哈希+范围索引。范围在事件时间上
现在我想扫描或查询两个特定日期之间的所有项目
因此,我将以下参数发送到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将以与“数据分发:分区键”中所述相同的方式计算分区键的哈希值,但它将具有相同分区键值的所有项按排序键值物理地紧密地存储在一起
另外,您应该选择能够很好地分布数据的分区键。如果evenName的值总数很小,则它可能不是最佳选项(请参阅)
也就是说,如果您已经将eventName
作为哈希键,将eventTime
作为范围键,那么您应该查询(对于伪代码,我通常使用):
您不需要额外的or。请注意,GSI允许您查询未使用表哈希和范围键编制索引的列,但要查询时间戳之间的数据,您仍然需要范围键或需要执行其他操作。您应该使用
查询
。如果要查询值,则不能仅使用范围键在两个范围键之间,您也需要使用哈希键,因为范围键。这是因为哈希键(分区键)用于选择存储数据的物理分区,按范围键(排序键)排序。从:
如果表有一个复合主键(分区键和排序键),DynamoDB将以与“数据分发:分区键”中所述相同的方式计算分区键的哈希值,但它将具有相同分区键值的所有项按排序键值物理地紧密地存储在一起
此外,您应该选择能够很好地分布数据的分区键。如果evenName的值总数很小,那么它可能不是最佳选项(请参阅)
也就是说,如果您已经将eventName
作为哈希键,将eventTime
作为范围键,那么您应该查询(对于伪代码,我通常使用):
您不需要额外的or。请注意,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);
});
}
使用此查询
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);
});
}
query
是一种方法。您在查询中提供了哈希键吗?您不能只按范围索引进行查询,除非您使用Thank@JakubM。GSI是一种方法。我仍然不知道如何仅在事件时间创建二级索引,我是否将其创建为哈希?query
是一种方法。您在查询中提供了哈希键吗?你不能只按范围索引进行查询,除非你正在使用Thank@JakubM.GSI。我仍然不知道如何仅在事件时间创建二级索引,我是否将其创建为哈希?