2017-02-08 7 views
0

У меня есть таблица DynamoDB, которая выглядит следующим образом:Противоречивые результаты с запросом/DynamoDB сканирования - NodeJS

enter image description here

(есть как 1500000 записей, как этот с различными временными метками)

У меня есть 2 GSI:

enter image description here

Я пытаюсь получить все строки в таблице для данного г ау.

Это то, что мой код выглядит следующим образом (NodeJS):

var AWS = require("aws-sdk"); 

AWS.config.update({accessKeyId: "", secretAccessKey: ""}); 
AWS.config.update({region: 'us-east-1'}); 

var docClient = new AWS.DynamoDB.DocumentClient(); 

var params = { 
    TableName: "QfGamingTransactionsProd", 
    IndexName: 'Result-RedeemedAt-index', 
    KeyConditionExpression: "#rs = :result and begins_with (#rat, :Rat)", 
    ExpressionAttributeNames: { 
     "#rs": "Result", 
     "#rat": "RedeemedAt" 
    }, 
    ExpressionAttributeValues: { 
     ":result": "SUCCESS", 
     ":Rat": "2016-10-20" 
    } 
}; 

docClient.query(params, function (err, data) { 
    if (err) { 
     console.error("Unable to query. Error:", JSON.stringify(err, null, 2)); 
    } else { 
     console.log("\nQuery succeeded. \n"); 
     console.log("- Total", data.Count); 
    } 
}); 

Это, кажется, работает, но я получаю (путь) меньше результатов, чем ожидалось. Этот же код отлично работает на меньшей таблице.

Похожие результаты с "Scan".

Что мне не хватает?

Заранее спасибо.

DV

ответ

0

Это происходит потому, что по умолчанию DynamoDB будет возвращать только 1 Мб данных в то время, но есть способ решить эту проблему.

Вы должны изменить свою реализацию как следующие

Шаг 1: Вызов DyanmoDB стол, он будет возвращать 1-1 Мб данных, с тем, что будет возвращать "Next Evaluated Key"

Шаг 2: Вызов Dynamodb стол еще раз, но на этот раз вы проходите "Next Evaluated Key" в "Exclusive Start key", чтобы получить новый набор данных

Step3: Проверьте "Next Evaluated Key" все еще доступны затем повторите step2 еще вы получили все данные для этого ключа

Здесь приведены ссылки:

About query limits

Blog on how to implement this code

Надежда, что помогает

0

По размеру каждой записи количество измененных записей изменится, так как dynamodb имеет ограничение по размеру для запроса (1 МБ).

В dynamodb запрос вернет 1 миллиона данных. Но мы можем разглядеть результаты. Это может решить вашу проблему. Данные, возвращаемые запросом, будут содержать «LastEvaluateKey», если данные, удовлетворяющие этому запросу, не будут полностью восстановлены. Поэтому мы должны установить «LastEvaluateKey» как «ExclusiveStartKey». Затем запрос будет извлекать оставшиеся данные. Рекурсивно следуя этому методу, мы получим полные данные.

var data = []; 
async.until(function() { 
    return scanComplete; 
}, 
    function (callback) { 
    docClient.query(params, function (err, result) { 
     if (err) { 
     console.log(err); 
     } else { 
     data.push(result.Items); 
     if (typeof (result.LastEvaluatedKey) === 'undefined') { 
      scanComplete = true; 
      //fully retrieved 
     } else { 
      params.ExclusiveStartKey = result.LastEvaluatedKey; 
     } 
     if (!scanComplete) { 
     } 
     } 
     callback(err); 
    }); 
    }, 
    // this runs when the loop is complete or returns an error 
    function (err) { 
    if (err) { 
     console.log('error in processing scan '); 
     console.log(err); 
     reject(err); 
    } else { 
     resolve(data); 
    } 
    });