DynamoDB查询|如何获得按最新时间戳排序的所有记录?

时间:2019-10-23 11:44:17

标签: angular amazon-web-services nosql amazon-dynamodb

我正在使用DynamoDB来存储Web应用程序的记录。

每个记录都有一个uuid(分区键)和一个unix时间戳(排序键)。 如何获取按最新时间戳排序的所有记录?

使用扫描非常昂贵,并且显然需要使用查询来提交分区键

我已经尝试过的代码出现以下错误:

 Query condition missed key schema element: uuid

我的服务:

serverCallChats() {
    return new Promise(async (resolve, reject) => {
        const _dynamoDB = new AWS.DynamoDB.DocumentClient();

        const daysBack = (days) => {
            const date = new Date();
            date.setDate(date.getDate() - days);
            return date.getTime();
        };

        const params = {
            TableName: 'chat-channel',
            KeyConditionExpression: '#sortKeyName < :days',
            ExpressionAttributeNames: {
                '#sortKeyName': 'timestamp'
            },
            ExpressionAttributeValues: {
                ':days': daysBack(7)
            }
        };

1 个答案:

答案 0 :(得分:0)

所以我用例的解决方案是使用FilterExpression中的扫描和过滤器:

return new Promise(async (resolve, reject) => {
        const _dynamoDB = new AWS.DynamoDB.DocumentClient();

        const daysBack = (days) => {
            const date = new Date();
            date.setDate(date.getDate() - days);
            return date.getTime();
        };

        const params = {
            TableName: 'chat-table',
            FilterExpression: 'latestActivity > :hkey',
            ExpressionAttributeValues: {
                ':hkey': daysBack(7)
            },
        };

        _dynamoDB.scan(params, (err, data) => {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log('chatdata: ', data);
                resolve(data);
           }
        });
    });

使用此解决方案,将不会对数据库的输出进行排序,而必须在客户端中完成。但是,考虑到扫描的大小,这是适合我的情况的解决方案