ニフティのmBaaSでデータストアのデータを全て取得する

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件にして、複数回に分けてデータを取得するようにしています。

to-get-all-the-data-in-the-mbaas-of-nifty01

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件のデータが取得できていることが確認できました。

to-get-all-the-data-in-the-mbaas-of-nifty02

 

もっとよいやり方があるかもしれませんが、とりあえずこれで全データの取得はできそうでした。
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年11月
 12
3456789
10111213141516
17181920212223
24252627282930