7. JSONオブジェクトストレージ

ここではJSONオブジェクトストレージの利用方法について説明します。

7.1. バケットの取得

バケットの取得には、NbService.objectBucketManager() で取得される オブジェクトバケットマネージャを使用します。

オブジェクトのクエリ操作などにはバケットが必ず必要になります。

NbObjectBucketManager obm = NbService.getInstance().objectBucketManager();
NbObjectBucket bucket = obm.getBucket("TodoTutorial1");

7.2. オブジェクトの追加

オブジェクトは NbObject として生成します。

NbObject obj = new NbObject(mService, "Todos");
obj.put("description", s);

コンストラクタの引数にNbServiceとバケット名を渡します。 値は put() で設定します。

オブジェクトを保存するには、save() メソッドを呼び出します。

obj.save(new NbCallback<NbObject>() {
    @Override
    public void onSuccess(NbObject obj) {
        // 成功時の処理
    }

    @Override
    public void onFailure(int arg0) {
        // 失敗時の処理
    }
});

7.2.1. オブジェクトに設定できる値

オブジェクトに put() で設定できる値は、以下のいずれかのクラスのインスタンスです。

  • Number
  • String
  • Boolean
  • NbJSONObject (または Map<String,Object>)
  • NbJSONArray (または List<Object>)

NbJSONObject, NbJSONArray はそれぞれ JSON オブジェクトおよび配列に相当します。 NbJSONObject, NbJSONArray に格納できる値も上記いずれかのクラスのインスタンスです。 また、NbJSONObject, NbJSONArray は入れ子にすることが可能です。

以下に例を示します。

obj.put("name", "Taro Nichiden"); // String
obj.put("age", 27); // Number
obj.put("married", true); // Boolean

NbJSONObject contact = new NbJSONObject();
contact.put("tel", "03-xxxx-yyyy");
contact.put("email", "taro@example.com");
obj.put("contact", contact); // JSON Object

obj.put("hobbies", Arrays.asList("Tennis", "Fishing")); // JSON Array

7.3. アクセス制御

オブジェクト単位でアクセス制御を行うことができます。

アクセス制御には、ACLクラスを使用します。NbObject に setAcl で ACL を設定します。

NbAcl acl = new NbAcl();
acl.setOwner("オーナID");
acl.addEntry(NbAclPermission.READ, "ユーザID");
acl.addEntry(NbAclPermission.READ, "g:グループ名");
acl.addEntry(NbAclPermission.WRITE, "ユーザID");

NbObject obj = new NbObject("Todos", nebulaService);
obj.setAcl(acl);
  • setOwner() でオーナID(オーナのユーザID)を設定します。
  • addEntry() でエントリを追加します。
    • 第1引数に権限種別を指定します。
    • 第2引数に、ユーザID/グループ名を指定します。NbUser, NbGroup も指定可能です。

7.4. オブジェクトの更新

オブジェクトを更新するには、NbObject の save() メソッドを使用します。

最初にクエリを行って NbObject のインスタンスを取得し、 オブジェクトに値を設定して save() を呼び出すという流れになります。

7.5. オブジェクトの削除

オブジェクトを更新するには、NbObject の deleteObject() メソッドを使用します。

更新の場合と同様最初にクエリを行って NbObject のインスタンスを取得し、 その後 deleteObject() を呼び出すという流れになります。

7.6. バッチリクエスト

複数のオブジェクトの追加・更新・削除を1回の API で実行することができます。

以下に使用例を示します。

// バッチリクエスト
NbJSONArray requests = new NbJSONArray();

// 挿入したいデータ
NbObject obj1 = bucket.newObject();
obj1.put(...);
...
requests.add(bucket.createBatchRequest(obj1, NbBatchOperationType.INSERT));

// 更新したいデータ
NbObject obj2 = ...;
obj2.put(...);
...
requests.add(bucket.createBatchRequest(obj2, NbBatchOperationType.UPDATE));

// 削除したいデータ
NbObject obj3 = ...;
...
requests.add(bucket.createBatchRequest(obj3, NbBatchOperationType.DELETE));

// リクエスト実行
String token = UUID.randomUUID().toString();
bucket.executeBatchOperation(requests, token, new NbCallback<NbJSONArray>() {
    @Override
    public onSuccess(NbJSONArray results) {
        for (int i = 0; i < results.size(); i++) {
            NbJSONObject result = results.get(i);

            // result code
            String result = result.getString("result");
            // reason code
            String reason = result.getString("reasonCode");
            // データ
            NbObject obj = (NbObject)result.get("data");
        }
    }
    @Override
    public onFailure(int statusCode, NbErrorInfo errorInfo) {
        ...
    }
});

最初にバッチリクエスト用に JSON Array を作成します。

そして、この JSON Array に、操作したい NbObject に対するバッチリクエストを作成・ 追加していきます。これには NbObjectBucket.createBatchRequest() を使用します。

最後に、NbObjectBucket.executBatchOperation() を実行すると、バッチリクエストが サーバに送信されます。成功すると、onSuccess が呼び出されます。

onSuccess 引数の results には、リクエスト時のオブジェクト数に対応した数の レスポンスが格納されます。レスポンスにはレスポンスコード、リーズンコード(失敗時)、 NbObject型のデータが格納されます。

注意

一回のバッチリクエストで要求できるリクエスト数は無制限となっていますが、 リクエスト数が多いとサーバに大きな負荷がかかりますので、通常は100件以下に留めてください。