データストアのクラス同士でデータを連係させる場合、二つの方法が用意されています。
- ポインター
- リレーション
ポインターは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型のデータベースを使いつつもデータをリレーショナルに管理したいという要望は根強くあります。そうした時にはポインターやリレーションを使ったり、さらにサブクエリを使うことで柔軟なデータ抽出が実現できるでしょう。