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件レコードを準備しました。
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順に取得するときに限ります。
レコードID順でしか取ってこれないので、方法2のカーソルAPIを使用するか、
kintone REST API Clientを使って1万件以上取得するかとしたいところですね。