mBaaSのデータストアではクラス同士の繋がりを管理するためにポインターとリレーションという二つの機能を提供しています。どちらも似たような機能ですが、その使い方がそれぞれ違いますので、より深くデータストアを使いこなす際にはぜひ覚えてください。
ポインター
ポインターはクラス同士を1対1の関係で結びつけます。あるレコードの中に、別なクラスのオブジェクトIDを残すものです。例えば写真クラス(Photo)にユーザを結びつけることで、誰が写真の所有者かを管理できます。
const Photo = ncmb.DataStore('Photo'); const photo = new Photo(); photo .set('user', ncmb.User.getCurrentUser()) .set('title', '公園の写真') .save() .then((data) => { // 写真アップロード完了 }) .catch(err => console.log(err));
そして、写真データを取得する際に include を使ってユーザデータも一緒に取得できます。
const Photo = ncmb.DataStore('Photo'); Photo .include('user') .fetchAll() .then((photos) => { // 写真の配列 photos[0].user // ユーザの情報 }) .catch(err => console.log(err));
ただしユーザからの逆引きではできませんので注意してください。例えば user.photos
といった指定はできません。
リレーション
リレーションはクラス同士を1対nの関係で結びつけます。あるレコードの中に、別なクラスの複数のオブジェクトIDを残すものです。例えばユーザにアップロードした写真を結びつけるといったことが可能です。
const user = ncmb.User.getCurrentUser(); const photos = new ncmb.Relation(); const Photo = ncmb.DataStore('Photo'); photos .add(new Photo) .add(new Photo); user .set('photos', photos) .save() .then((data) => { // 写真の紐付け完了 }) .catch(err => console.log(err));
取得する場合、includeのような方法は使えません。検索対象はPhotoクラスになります。
const Photo = ncmb.DataStore("Photo"); Photo .relatedTo(ncmb.User.getCurrentUser(), "user") .fetchAll() .then((photos) => { // 写真の配列 }) .catch(err => console.log(err));
ポインターがユーザレコードの中にデータを持っていたのに対して、リレーションでは写真データを検索する形でユーザデータを指定するのが特徴です。
管理画面での違い
管理画面上ではそれぞれポインターを見る、リレーションを見ると言った違いがあります。どちらも関連づけを行ったクラス(写真またはユーザ)からしか辿れないので注意してください。
まとめ
ポインターとリレーションは似たようなことができますが、データの保存方法や取得方法が異なります。クラス同士の関連性であったり、データをどう取り出すかによって使い分けるのがいいでしょう。