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

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

データストアでポインターデータを検索する

f:id:mbaasdevrel:20180913163950p:plain

データストアでオブジェクト同士の繋がりを表現する方法は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として覚えておいてください。

中津川 篤司

中津川 篤司

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