こんにちは!ケイマエです。
最近受託案件でkintoneを触ることになり、自分が調べても意外に載ってなかったことをメモがてら書いていこうと思います。
今回はカーソルAPIで再帰的にレコードを取得する方法についてです。
さっそくいきます!
カーソルAPIを使った方がいい時とは?
・1万件以上のデータを扱う可能性がある時
・クエリによって絞り込みを行いたい時
この2つが当てはまるならカーソルAPIが必須になります。
1万件以下の場合はoffset指定で対応できますし、クエリでの絞り込みが不要なら$id順で取得できます。
私はこの2つが当てはまったのでカーソルAPIを使うことにしました!
一応使わない方がいい場合もありまして、カーソルは1アカウントにつき10件までしか生成できないので、あまりにも多くの不特定多数が利用するサービスには向いていません。
(カーソルは取得し終えたら消える、しかもほぼ一瞬で終わるのでそこまで気にしなくてもいいかもしれませんが。)
さっそく次は使い方にいきましょう。
カーソルAPIの使い方
さぁ、使い方ですが・・・と私が説明する必要もなく公式がドキュメントを作ってくれていますのでそちらを見ましょう!
レコードの一括取得 – cybozu developer network
ドキュメントを見れば分かると思いますが、
1.特定のクエリとsizeを指定してカーソルを作成する
2.作成したカーソルからレコードを取得する
という感じになります。
しかし、私はここで困りました。
この公式のドキュメントの「カーソルからレコードを取得」は再帰的にレコードを取得していないのです!
どういうことかと言いますと、レコードが1万件あったとしても500件レコードを取得するだけで終わっているのです。
おいおい、カーソル使う時はデータ数が多いに決まっているのだから再帰的に取得する方法まで書いておいてくれよ・・・と思いませんか?
安心してください。そんなあなたのために私はこの記事を書きました。
こちらがカーソルから再帰的にレコードを取得する方法です。↓
// レコード一括取得の関数
var getRecordsByCursorId = function(data) {
var data = data;
if (!data) {
data = {
records: []
};
}
var body = {
id: cursorId
};
return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'GET', body).then(function(r) {
data.records = data.records.concat(r.records);
if (r.next) {
return getRecordsByCursorId(data);
}
return data;
});
};
// 関数呼び出し
const response = getRecordsByCursorId();
console.log(response.records);
body の id: cursorId のcursorIdに実際に作成したカーソルIDを代入してもらえば後はコピペでいけると思います。
ポイントはレスポンスの next というプロパティです。
カーソルにまだレコードが残っていれば true 、カーソルにレコードがもうない時は false が入ります。
true が返る限り再帰的に実行して、最終的に全てのレコードが response.records に返ってきます。
これを利用すれば何十万のレコードでも取得可能です(^-^)
以上、カーソルAPIを利用して1万件データを取得するでした!
お役に立ちましたら幸いです。
それではまたの記事でノシ