データストアでオブジェクト同士の繋がりを表現する方法は2つあります。
- ポインター
- リレーション
ポインターは1対1、リレーションは1対nを表現するのに使いますが、ポインターデータで検索したいこともあるでしょう。そんな時のテクニックを紹介します。
ポインターデータの形式
NCMBの管理画面でポインターデータにマウスを当てると、次のように表示されているのが分かるかと思います。
{ "__type": "Pointer", "className": "Hogehoge", "objectId": "AAAAAA" }
これはデータ形式がポインターであり、データがHogehogeクラス、objectIdがAAAAAAとつながっているということを意味しています。
データの検索法
このデータフォーマットさえ分かっていれば、クエリを用いて検索できます。たとえばJavaScript SDKでは次のように書けます。
const Item = ncmb.DataStore('Item'); const user = ncmb.User.getCurrentUser(); const results = await Item .equalTo('user', { __type: 'Pointer', className: 'user', objectId: user.objectId }) .fetchAll();
上記のコードはItemクラスにある、userフィールドの値が objectId = user.objectId
のデータをすべて取得するという意味になります。これを次のように書いてもうまく検索できないので注意してください。
const Item = ncmb.DataStore('Item'); const user = ncmb.User.getCurrentUser(); const results = await Item .equalTo('user', user) // ← データストアのオブジェクトを適用してしまう .fetchAll();
上記コードは自分に紐付いているデータを一覧取得しようとしていますが、うまくいかないでしょう。オブジェクトにはobjectId以外にもaclやcreateDateなどのデータがあるため、検索時にそれらのデータも条件に含まれてしまいます。あくまでもポインターとして、objectIdだけを検索条件に指定する必要があります。
まとめ
ポインターを指定して検索すると、ACLとは別で自分だけのデータを検索したり、リレーションとはまた異なる使い方が生まれます。ぜひデータストアのTipsとして覚えておいてください。