ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

ロールに所属するユーザを100件以上取得する

ロールに所属している会員を取得する際の上限数について · Issue #774 · NIFTYCloud-mbaas/UserCommunityより。

あるロールに所属するユーザを取得する場合には ncmb.Role.fetchAll() を使います。

// 通常のやり方
ncmb.Role.equalTo("roleName","Pro").fetch()
  .then(function(role){
        return role.fetchUser();
  })
  .then(function(users){
    console.log(users.length);
    // -> 100
  });

しかしこの方法の場合、ユーザは最大100件までしか取得できません。また、limitはサポートされていません。

この状態で101件目以降のユーザを取得するには次のように実装します。

ncmb.Role.equalTo("roleName","Pro").fetch()
  .then((role) => {
    ncmb.User
      .relatedTo(role, 'belongUser')
      .limit(1000)
      .fetchAll()
      .then((users) => {
        console.log(users.length);
        // -> 1000
      })
  });

この方法は JavaScript SDKのlib/role.js#238を見ると分かります。

["user", "role"].forEach(function(classname){
  var upper = classname[0].toUpperCase() + classname.substr(1);
  var key = "belong" + upper;
    : 省略
  var fetchName = "fetch" + upper;
  Role.prototype[fetchName] = function(callback){
    return ncmb[upper].relatedTo(this,key).fetchAll(callback);
  };
});

UserおよりRoleに対して同じように実装されています。Roleは子ロールに対して適用されるものです。つまりUserの場合は次のように考えることができます。

ncmb.User.relatedTo(this, key).fetchAll()

この時、thisはロールオブジェクト自身になり、keyはbelogUserになります。

ncmb.User.relatedTo(role, 'belongUser').fetchAll()

こうなれば通常のデータストアと変わりませんのでlimitやskipなどを組み合わせられますし、細かい検索もできるようになるでしょう。課金ユーザの中で直近3ヶ月以内に登録してくれた方たちといった条件付けにも使えるはずです。

今回のコードはJSFiddleで実際に実行できます。試しにユーザを作る場合にはこちらのコードを参考にしてください。

JavaScript SDKはオープンソースになっていますので、ソースコードを見つつ拡張したり、異なるデータの取得法も行えます。ぜひ参考にしてください。

他にも質問があればぜひユーザコミュニティまでお寄せください!