FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

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

サブクエリを使いこなそう

f:id:mbaasdevrel:20180913163950p:plain

データストアのクラス同士でデータを連係させる場合、二つの方法が用意されています。

  1. ポインター
  2. リレーション

ポインターは1対n、リレーションはn対nのデータ関係性において利用が可能です。しかし、データ連係を行わずに各クラスにデータを投入してしまっている場合もあるでしょう。そこで使ってみたいのがサブクエリです。

通常の方法

例えば以下のようなデータを考えてみます。

Groupクラス

name
Group 1
Group 2
Group 3

Memberクラス

Group name
Group 1 Test 1
Group 1 Test 2
Group 1 Test 3
Group 2 Test 4
Group 2 Test 5
Group 2 Test 6

リレーションやポインターがない状態ですと、例えば以下のような検索方法が考えられます。

const group = await ncmb.DataStore('Group')
  .equalTo('name', 'Group2')
  .fetch();
const Members = ncmb.DataStore('Members');
const members = await Members
  .equalTo('Group', group.name)
  .fetchAll();
console.log(members);

この場合の問題点としては、クエリを2回実行しているということです。そのため、APIの消費量はもちろん、ネットワークの遅延も発生します。

サブクエリの利用

サブクエリを使った場合、次のようなコードになります。

const group = ncmb.DataStore('Group')
  .equalTo('name', 'Group2');
const Members = ncmb.DataStore('Members');
const members = await Members
  .select('Group', 'name', group)
  .fetchAll();
console.log(members);

見て分かる通り、グループについては検索を実行していません。その状態でメンバークラスのselectメソッドを使います。そうすることでグループの検索結果を用いて、その条件にマッチするデータを取り出すことができます。

ポインターやリレーションでも同じような操作はできますが、より柔軟な検索が可能です。

まとめ

mBaaSのようなNoSQL型のデータベースを使いつつもデータをリレーショナルに管理したいという要望は根強くあります。そうした時にはポインターやリレーションを使ったり、さらにサブクエリを使うことで柔軟なデータ抽出が実現できるでしょう。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。