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
コメントが承認されるまで時間がかかります。