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

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

https://cs.cybozu.co.jp/2019/006924.html

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

下記ページによると、

https://developer.cybozu.io/hc/ja/articles/360030757312

>レコードを一括取得する方法には、「レコード 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件レコードを準備しました。

https://testdata.userlocal.jp/

全部架空です。
フィールドは氏名、性別、生年月日のみ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9cfa2913-e2b1-a93b-f4c8-a1fe2ab8dec7.png)

# JavaScript
[サンプルコード](https://developer.cybozu.io/hc/ja/articles/360031191791#use_id)のvarをletやconstに変更して、
アプリIDやソート、絞り込み条件などを~~消し~~シンプルにしてみました。

```js
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/443784c3-b12f-ab91-d412-ace598edbf17.png)

レコードID順でしか取ってこれないので、[方法2のカーソルAPI](https://developer.cybozu.io/hc/ja/articles/360031191791#use_cursor)を使用するか、
[kintone REST API Client](https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client)を使って1万件以上取得するかとしたいところですね。