繁体   English   中英

aws dynamodb - 如何按日期查询排序键

[英]aws dynamodb - how to query by date for sort key

我想查询表并获取特定日期之后的数据。

Hash 密钥:id
排序键:时间戳

错误

ValidationException: Query condition missed key schema element: id

索引.js

var aws = require('aws-sdk');
const dynamodb = new aws.DynamoDB();

exports.handler = async (event, context, callback) => {
  const documentClient = new aws.DynamoDB.DocumentClient();

  const params = {
    TableName : 'dynamodb-log-testing',
    KeyConditionExpression: '#myTimestamp >= :myDate',
    ExpressionAttributeNames: {
      "#myTimestamp": "timestamp"
    },
    ExpressionAttributeValues: {   
        ':myDate': '2017-11-17'
    }
  };

    try{
        const data = await documentClient.query(params).promise();
        console.log(data)
    }catch(err){
      console.log(err)
    }

};

DynamoDB 表上的所有查询都必须包含分区键(又名 HASH)。 您可以使用scan ,但不建议在大多数用例中使用。 您可以创建一个 GSI,其中索引上的分区是固定值,并且排序键具有相同的timestamp值。 这将允许您以您描述的方式查询索引(除了您还将在查询中包含固定值)。 您的查询将如下所示:

var aws = require('aws-sdk');
const dynamodb = new aws.DynamoDB();

exports.handler = async (event, context, callback) => {
  const documentClient = new aws.DynamoDB.DocumentClient();

  const params = {
    TableName : 'dynamodb-log-testing',
    IndexName: 'myGSI1',
    KeyConditionExpression: 'gsi1pk = :fixedValue and #myTimestamp >= :myDate',
    ExpressionAttributeNames: {
      "#myTimestamp": "timestamp"
    },
    ExpressionAttributeValues: {   
        ':myDate': '2017-11-17',
        ':fixedValue': 'some fixed value'
    }
  };

    try{
        const data = await documentClient.query(params).promise();
        console.log(data)
    }catch(err){
      console.log(err)
    }

};

请记住,如果您的数据很大,这个 model 在 GSI 上有很大的热分区潜力。 出于这个原因,您可能需要重新考虑一下访问模式。 如果您可以做一些事情,比如在分区中包含时间戳的日期部分,并且只包含有助于排序的时间。 这确实意味着您不能在单个查询中跨天查询。

Best Practices for Designing and Architecting with DynamoDB有很多关于 DynamoDB 最佳实践的有用信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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