DynamoDB Query |Как я могу получить все записи отсортированы по новейшей отметке времени? - PullRequest
1 голос
/ 23 октября 2019

Я использую DynamoDB для хранения записей для веб-приложения.

Каждая запись имеет 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 голосов
/ 28 октября 2019

Таким образом, решение моего варианта использования состояло в том, чтобы использовать сканирование и фильтр из 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);
           }
        });
    });

При таком решении выходные данные из БД не будут сортироваться, и для этого потребуетсябыть сделано в клиенте. Однако это подходящее решение для моего случая, учитывая размер скана

...