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

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

Parse Serverのデータストア操作法(JavaScript SDK編)

NCMBのクロージングに伴って、アプリのバックエンド移行先を検討する必要が出ています。その開発については申し訳ない限りなのですが、そのために必要な情報は適宜お届けしていきます。

この記事では、移行先の候補であるParse Serverについて、その基本的な使い方を解説します。今回はJavaScript SDKです。

インストール

ブラウザで使う場合、npmまたはscriptタグの2つの使い方が考えられます。CDNでもプロダクション版が配信されています。

<script src="https://npmcdn.com/parse/dist/parse.min.js"></script>

npmの場合は、以下のようになります。

npm i parse
# または
yarn add parse

そして利用する際には requireimport を利用します。

const Parse = require('parse');

import Parse from 'parse';

なお、Node.jsの場合には parse/node を使います。

const Parse = require('parse/node');
// または
import Parse from 'parse/dist/parse.min.js';

データストアの使い方

オブジェクトの作成

まず基本形です。NCMBでいう ncmb.DataStore('GameScore') に相当する処理です。

const GameScore = Parse.Object.extend("GameScore");

この GameScore を継承したクラスも作成できます。

const Achievement = Parse.Object.extend({
  className: "Achievement"
});

さらにクラスに独自のメソッドを追加し、Parse.Objectで呼び出せるように設定できます。

class Monster extends Parse.Object {
  constructor() {
    // Pass the ClassName to the Parse.Object constructor
    super('Monster');
    // All other initialization
    this.sound = 'Rawr';
  }

  hasSuperHumanStrength() {
    return this.get('strength') > 18;
  }

  static spawn(strength) {
    const monster = new Monster();
    monster.set('strength', strength);
    return monster;
  }
}

// 登録
Parse.Object.registerSubclass('Monster', Monster);

新規作成

データストアのアイテムはParse.Objectと呼ばれます。この操作はNCMBと同じです。

const gameScore = new GameScore();
gameScore.set("score", 1337);
gameScore.set("playerName", "Sean Plott");
gameScore.set("cheatMode", false);
await gameScore.save();

更新

更新は新規保存と同じく save メソッドで行います。

gameScore.set("cheatMode", true);
gameScore.set("score", 1338);
await gameScore.save();

特殊な更新操作

以下のメソッドはNCMBと同じように使えるメソッドです。

メソッド名 説明
increment 数値のインクリメント
add データの配列による追加
addUnique データが配列に対してユニークな場合に追加
remove 該当する値を配列から削除
unset 指定されたフィールドを削除

削除

データの削除は destroy メソッドで行います。

await gameScore.destroy();

値の取得

各フィールドの値を取得する際には get メソッドを使います。

gameScore.get("score");
// 1338

attributes プロパティを使うと、データをまとめて取得できます。

const { score, playerName, cheatMode } = result.attributes;

規定のフィールドは以下の通りです。

const objectId = gameScore.id;
const updatedAt = gameScore.updatedAt;
const createdAt = gameScore.createdAt;
const acl = gameScore.getACL();
var userQuery = new Parse.Query(Parse.User);
userQuery.include("weaponsList");
const results = await userQuery.find();

検索

クエリーオブジェクトの作成

データを検索する際には、 Parse.Query オブジェクトを使います。

const query = new Parse.Query(GameScore);

データ1件の取得

データを1件だけ取得する場合には、objectIdを指定します。

const obj = await query.get("xWMyZ4YEGZ");

既存データの再取得を行う場合には fetch メソッドを使います。

await obj.fetch();

条件を指定して検索

データを検索する際には、条件を指定して find メソッドで取得します。

query.equalTo("playerName", "Dan Stemkoski");
const results = await query.find();
alert("Successfully retrieved " + results.length + " scores.");
for (const object of results) {
  alert(object.id + ' - ' + object.get('playerName'));
}

最初の一件を取得する婆には first メソッドを使います。配列ではなく、Parse.Objectが返ってきます(またはnull)。

const object = await query.first();

結果の行数も欲しい場合には withCount を使います。この場合、結果が以下のように変わるので注意してください。

const results = await query.withCount();
results.results // Parse.Objectの配列
results.count // 結果行数

なお、検索条件はNCMBとほぼ同じように指定できます。

  • equalTo
  • notEqualTo
  • greaterThan
  • greaterThanOrEqualTo
  • lessThan
  • lessThanOrEqualTo
  • containsAll
  • containedIn
  • notContainedIn
  • exists
  • doesNotExist
  • startsWith
  • fullText

また、クエリーの結果を検索条件に指定する matchesKeyInQuerydoesNotMatchKeyInQuery もあります。

const Team = Parse.Object.extend("Team");
const teamQuery = new Parse.Query(Team);
teamQuery.greaterThan("winPct", 0.5);
const userQuery = new Parse.Query(Parse.User);
userQuery.matchesKeyInQuery("hometown", "city", teamQuery);
const results = await userQuery.find();

その他、結果の絞り込みを行うメソッドです。

  • limit
  • skip
  • ascending
  • descending

結果からフィールドを取り除く

exclude を使うと、特定のフィールドを取り除いて結果を取得できます。以下の resultsplayerName というフィールドがありません。

query.exclude("playerName");
const results = await query.find();

ポインター

Parse.Object同士をつなげるポインター機能です。NCMBでも同様の機能がありますが、よりパワーアップした使い方ができます。

これはGemeオブジェクトに対して、現在のユーザーを紐付けた例です。

const game = new Parse.Object("Game");
game.set("createdBy", Parse.User.current());

ポインターになるオブジェクトは複数指定できます。

const scimitar = ...
const plasmaRifle = ...
const grenade = ...
const bunnyRabbit = ...

const user = Parse.User.current();
user.set("weaponsList", [scimitar, plasmaRifle, grenade, bunnyRabbit]);

どちらも get メソッドでデータを取得できます。

const weapons = user.get("weaponsList");

データ取得時にポインターデータも取得する場合には include メソッドを使います。

const userQuery = new Parse.Query(Parse.User);
userQuery.include("weaponsList");
const results = await userQuery.find();

まとめ

Parse Serverのデータストア操作はNCMBとほぼ変わりません。ただし、スキーマレスではないので、管理画面であらかじめスキーマ設計を行う必要がある点に注意してください。Parse.Schemaという仕組みを使うことでNode.jsからスキーマ生成もできますが、あまり頻度が多くはないので管理画面で作る方が手軽でしょう。

NCMBとしては今後、移行に伴う情報を積極的に発信していきます。皆さんには大変ご迷惑をおかけしますが、移行のご検討をお願い申し上げます。

Parse Platform