DynamoDB:仅查询每10个值

时间:2018-01-19 11:05:03

标签: javascript database nosql aws-lambda amazon-dynamodb

我在两个特定的unixtime值之间查询数据。例如:

1516338730 (今天,6:12)和 1516358930 (今天,11:48)之间的所有数据

我的数据库每分钟收到一条新记录。现在,当我想查询最后24h的数据时,它的方式太密集了。每隔10分钟就会很完美。

我现在的问题是:如何使用DynamoDB读取仅每10个数据库记录

据我所知,没有可能使用模数或类似的东西来满足我的需要。

到目前为止,这是我的AWS Lambda代码:

  var read = {
    TableName: "user",
    ProjectionExpression:"#time, #val",
    KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2",
    ExpressionAttributeNames:{
        "#time": "TIME",
        "#val": "user_data"
    },
    ExpressionAttributeValues: { 
      ":id": event, // primary key 
      ":time_1": 1516338730,
      ":time_2": 1516358930
    },
    ScanIndexForward: true
  };
  docClient.query(read, function(err, data) {
    if(err) {
      callback(err, null);
    }
    else {
      callback(null, data.Items);
    }
  });
};

2 个答案:

答案 0 :(得分:1)

我不认为使用dynamoDB API是可行的。

FilterExpression包含在Query操作之后但在数据返回给您之前应用DynamoDB的条件。 但是AFAIK不可能使用自定义功能。并内置functions are poor.

作为解决方法,您可以在客户端标记每个第10个项目。然后查询attribute_exists(或属性值)进行查询以过滤它们。

顺便说一下,用排序键'TIME'为'Id'属性创建索引会很好,以提高查询性能。

答案 1 :(得分:1)

你说你每分钟插入1条记录吗?

以下可能是一个选项:

在插入时,在记录上设置另一个字段,让我们将其称为MinuteBucket,其计算方式为the timestamp's minute value mod 10

如果您通过流功能执行此操作,则可以处理新记录,然后编写内容以触摸旧记录以强制进行计算。

您的查询将更改为:

/*...snip...*/
KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2 and MinuteBucket = :bucket_id",
/*...snip...*/
ExpressionAttributeValues: { 
  ":id": event, // primary key 
  ":time_1": 1516338730,
  ":time_2": 1516358930,
  ":bucket_id": 0 //can be 0-9, if you want the first record to be closer to time_1, then set this to :time_1 minute value mod 10
},
/*...snip...*/

正如后续想法一样:如果您想加快查询速度,可能会在索引中使用MinuteBucket进行调查,但这可能会带来更高的价格。