Monacaでニフティ mBaaSのデータストアを使っていたところ、取得できるデータの上限が決まっているようだったので、登録しているデータを全件取得できる方法を考えてみました。
サンプルコード
データストアからオブジェクトを取得するfetchAll()は、デフォルトでは上限が100件になっています。
limit()を使うことで上限を1000件まで引き上げられますが、1000件以上登録されている場合、すべてのデータを取得することはできません。
データ取得の際にcount()を設定すると条件に合致するデータの総数を返すので、その総数から必要な回数だけ再度データ取得を行うようにします。
HTML
<div ng-controller="ctrl"> <ul> <li ng-repeat="item in items">{{item.name}}</li> </ul> </div>
今回はactorsTableという名前のデータストアからデータを取得します。
1回に取得する数を10件にして、複数回に分けてデータを取得するようにしています。
JavaScript
var APIKEY = 'APIキー'; var CLIENTKEY = 'クライアントキー'; var ncmb = new NCMB(APIKEY, CLIENTKEY); var actorsTable = ncmb.DataStore("actorsTable"); var actorsData = new actorsTable(); var appModule = angular.module('app', []); appModule.controller('ctrl', function ($scope, $timeout) { $scope.items = []; var getDataCount = 10; // 1回に取得するデータの数 var allDataCount; // 登録してあるデータの総数 var fetchTimes; // データベースに通信する回数 var completedTimes = 0; // 2回目以降で通信完了した回数 var appendData = []; // 2回目以降のデータの仮格納場所 // 1回目のデータ取得 actorsTable.order('createDate', true).count().limit(getDataCount).fetchAll().then(function(results) { // 1回目分のデータを格納 $timeout(function() { $scope.items = results; }); // 2回目以降のデータ取得が必要な場合 allDataCount = results.count; if(allDataCount > getDataCount) { fetchTimes = Math.ceil(allDataCount / getDataCount); for (var i = 0; i < fetchTimes - 1; i++) { appendData[i] = []; getdata(i); } } }).catch(function(err) { console.log(err); }); // 2回目以降のデータ取得 function getdata(num) { actorsTable.order('createDate', true).skip((num + 1) * getDataCount).limit(getDataCount).fetchAll().then(function(results) { // 取得したデータを仮格納場所に保存 appendData[num] = results; completedTimes++; // 2回目以降のデータを全て取得したとき if(completedTimes == (fetchTimes - 1)) { // for文内で$timeoutが使えないので一旦データを変数にまとめる var addArr = []; for (var i = 0; i < fetchTimes - 1; i++) { for (var j = 0; j < appendData[i].length; j++) { addArr.push(appendData[i][j]); } } // 変数にまとめたデータを追加 $timeout(function() { $scope.items = $scope.items.concat(addArr); }); } }).catch(function(err) { console.log(err); }); } });
全50件のデータが取得できていることが確認できました。
もっとよいやり方があるかもしれませんが、とりあえずこれで全データの取得はできそうでした。
【参考サイト】
- [iOS] クエリの最大取得数に関して · Issue #169 · NIFTYCloud-mbaas/UserCommunity · GitHub
- データストア (Monaca) : 基本的な使い方 | ニフティクラウド mobile backend
コメントが承認されるまで時間がかかります。