0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

kintoneでレコード一括取得の「レコードIDを利用する方法」ではレコード1万件以上取得できるのか試してみた

Last updated at Posted at 2021-10-15

kintoneでレコードを一括取得する時、「1万件以上だったらカーソルAPIを使いましょう」と言われています。
というのも、投稿日から1年以上前の話ではありますが、2020年7月の定期メンテナンス以降、offsetの上限が1万件になったため、代わりにカーソルAPIを使いましょうということになりました。

レコードを1万件以上取得したい場合は具体的にどうしたらいいのか?

下記ページによると、

レコードを一括取得する方法には、「レコード ID を利用する方法」「カーソル API を利用する方法」「offset を利用する方法」の 3つの選択肢があります。
レコードのソート条件を必要としない場合(レコード ID 順で問題ない場合)場合、方法1: レコード ID を利用する方法を利用できます。
レコードのソート条件を必要とする場合のうち、取得するレコードが 1 万件を超えると見込まれる場合、方法2: カーソル API を利用する方法を利用してください。
一方、将来的にも取得するレコードが 1 万件を超えないと見込まれる場合、方法3: offset を利用する方法も利用可能です。

とのことで、「方法2: カーソル API を利用する方法」が推されています。
添えられているフローチャート画像を見てもナルホドそうなんだ!というところなのですが、

私は思いました。
つまりのところ、「方法1:レコードIDを利用する方法」は1万件以上取得できるのかどうなのか?
予想としては、offsetは使わず、レコードIDを利用して500件ずつ再帰的に取りに行くため1万件以上でもレコード取得できるはず。
と思ったのですが、「方法1で1万件以上取れます。」とははっきりとは書かれていません。

というわけで、前置きが長くなりましたが
今回は【「方法1:レコードIDを利用する方法」は1万件以上取得できるかどうか】試してみました!

アプリの準備

架空の個人情報ジェネレーターで1万100件レコードを準備しました。

全部架空です。
フィールドは氏名、性別、生年月日のみ。
image.png

JavaScript

サンプルコードのvarをletやconstに変更して、
アプリIDやソート、絞り込み条件などを消しシンプルにしてみました。

const getRecords = (_params) => {
  const MAX_READ_LIMIT = 500;

  const params = _params || {};
  const app = params.app || kintone.app.getId();
  const filterCond = params.filterCond;
  const sortConds = params.sortConds || ["$id asc"];
  const fields = params.fields;
  let data = params.data;

  if (!data) {
    data = {
      records: [],
      lastRecordId: 0,
    };
  }

  const conditions = [];
  const limit = MAX_READ_LIMIT;
  if (filterCond) {
    conditions.push(filterCond);
  }

  conditions.push("$id > " + data.lastRecordId);

  const sortCondsAndLimit =
    " order by " + sortConds.join(", ") + " limit " + limit;
  const query = conditions.join(" and ") + sortCondsAndLimit;
  const body = {
    app: app,
    query: query,
  };

  if (fields && fields.length > 0) {
    // $id で並び替えを行うため、取得フィールドに「$id」フィールドが含まれていなければ追加します
    if (fields.indexOf("$id") <= -1) {
      fields.push("$id");
    }
    body.fields = fields;
  }

  return kintone
    .api(kintone.api.url("/k/v1/records", true), "GET", body)
    .then((r) => {
      data.records = data.records.concat(r.records);
      if (r.records.length === limit) {
        // 取得レコードの件数が limit と同じ場合は、未取得のレコードが残っている場合があるので、getRecords を再帰呼び出して、残りのレコードを取得します
        data.lastRecordId = r.records[r.records.length - 1].$id.value;
        return getRecords({
          app: app,
          filterCond: filterCond,
          sortConds: sortConds,
          fields: fields,
          data: data,
        });
      }
      delete data.lastRecordId;
      return data;
    });
};

kintone.events.on(["app.record.detail.show"], (event) => {
  const params = {
    app: アプリID,
    sortConds: ["$id asc"],
  };
  getRecords(params).then((resp) => {
    console.log(resp);
  });
});

結果

10,100件(1万件以上)のレコードを取ってこれました。※レコードID順に取得するときに限ります。
image.png

レコードID順でしか取ってこれないので、方法2のカーソルAPIを使用するか、
kintone REST API Clientを使って1万件以上取得するかとしたいところですね。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?