11
13

More than 5 years have passed since last update.

大きいデータに対するクエリを複数回に分ける方法

Last updated at Posted at 2018-02-21

AWSのdynamoDBでは1度のクエリで取ってこれるデータの最大容量が 1MBとなっています。
これを超える場合1度にデータを全部取ってくることができないので複数回に分けてクエリを投げないといけません。
クエリ内で再帰関数を渡してあげれば簡単にいけました。

query.js
const aws = require("aws-sdk");
const dynamodb = new aws.DynamoDB.DocumentClient({ region: "ap-northeast-1" });


const queryToBigData = (params) => {
    const result = [];
    dynamodb.query(params, onQuery);

    function onQuery(err, data) {
        if (err) {
            console.error(err);
            return Promise.reject(err);
        } else {
            if (result.length !== 0) {
                data["Items"].forEach(item => {
                    result[0].push(item);
                });
            } else {
                result.push(data.Items);
            }
            if (typeof data.LastEvaluatedKey !== "undefined") {
                params.ExclusiveStartKey = data.LastEvaluatedKey;
                dynamodb.query(params, onQuery);
            } else {
                console.log("データ全部取れたよ");
                return Promise.resolve(result);
            }
        }
    }

}

data.LastEvaluatedKeyに取りきれなかったデータの最初の位置が入るのでこれに値が入っている限りデータを取り続けます。
paramsのExclusiveStartKeyに取り始める位置を入れてあげることで途中からクエリを投げてくれるみたいです。

11
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13