6. オブジェクトストレージ

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

6.1. バケットの取得

NEC BaaS Embedded SDKではサーバへのバケットの生成はサポートしていないため、事前にデベロッパーコンソールなどから該当のバケットを作成しておきます。

オブジェクトのクエリ操作などにはバケットが必要になります。 以下のようにオブジェクトバケットのインスタンスを生成します。

// バケットのインスタンス作成
NbObjectBucket bucket1(service1, "bucketName");

6.2. オブジェクトの追加

オブジェクトを追加するには、まずインスタンスを生成します。 コンストラクタの引数にNbServiceとバケット名を渡します。

保存先のバケットのインスタンスを生成済みの場合、NewObject()を使用することもできます。

// オブジェクトの生成
NbObject object1(service1, "bucketName");
NbObject object2 = bucket1.NewObject();

オブジェクトをサーバに保存するには、Save() メソッドを呼び出します。 成功した場合、savedObjectにはサーバに保存されたオブジェクトのインスタンスが取得できます。

// オブジェクトの保存
NbResult<NbObject> resultSave = object1.Save();
if(resultSave.IsSuccess()) {
    // Save成功
    NbObject savedObject = resultSave.GetSuccessData();
} else {
    // Save失敗
}

6.2.1. オブジェクトへのデータ設定

オブジェクトには以下の型の値を設定することができます。

  • int, unsigned int
  • int64_t, uint64_t
  • double
  • bool
  • std::string
  • NbJsonObject
  • NbJsonArray

[]演算子では、プリミティブ型の値を設定できます。

NbObject nbobject(service1, "bucketName");

nbobject["keyString"] = "string";
nbobject["keyInt"] = 1000;
nbobject["keyDouble"] = 10.1;
nbobject["keyBool"] = true;

NbJsonObject, NbJsonArrayはJSON オブジェクトおよび配列に相当します。 これらを設定する場合、それぞれPutJsonObject()、PutJsonArray()を使用します。 NbJSONObject, NbJSONArray は入れ子にすることが可能です。

以下に例を示します。

NbJsonObject jsonObj1;
NbJsonArray  jsonAry1;

// JsonArrayをJsonObjectに加える
jsonObj1["keyJsonObjString"] = "jsonObjectString";
jsonAry1[0] = "jsonArrayString";
jsonObj1.PutJsonArray("jsonAry1", jsonAry1);

// NbJsonObjectをNbObjectに加える
nbobject.PutJsonObject("keyJsonObj1", jsonObj1);

上記の処理の結果、NbObjectには以下のようなJSONが格納されます。

{
 "keyBool":true,
 "keyDouble":10.1,
 "keyInt":1000,
 "keyJsonObj1":
 {
     "jsonAry1":["jsonArrayString"],
     "keyJsonObjString":"jsonObjectString"
 },
 "keyString":"string"
}

6.3. アクセス制御

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

アクセス制御には、ACLクラスを使用します。NbObject の SetAcl() で ACL を設定します。 ACLにはアクセスを許可するユーザID、グループのエントリを追加します。 ユーザIDはユーザ生成時にランダムに割り当てられる文字列です グループ名は管理者がグループ追加時に決定する"g:"で始まる文字列です

  • SetRead()
  • SetWrite()
  • SetCreate()
  • SetUpdate()
  • SetDelete()
  • SetOwnder()
NbAcl acl;
acl.SetOwner("ownerId");
acl.SetRead({"userId_1", "g:groupId_1"});
acl.SetWrite({"userId_2", "g:groupId_2"});

NbObject object4(service1, "bucketName");
object4.SetAcl(acl);

上記の処理の結果、オブジェクトには以下のようなACLが設定されます。

{
 "admin":[],
 "c":[],
 "d":[],
 "owner":"ownerId",
 "r":["g:groupId_1","userId_1"],
 "u":[],
 "w":["g:groupId_2","userId_2"]
}

注釈

OwnerにはユーザID1件のみが指定できます。その他は複数のユーザ、グループが指定可能です。

またACLを生成するメソッドを使用することもできます。

// anonymousアクセス(R/W/Admin)可能な ACL を生成する
// ログインしていないユーザでも自由にアクセス可能
NbAcl anonymousAcl = NbAcl::CreateAclForAnonymous();
// Authenticatedアクセス(R/W/Admin)可能な ACL を生成する
// ログインしたユーザであれば自由にアクセス可能
NbAcl authenticatedAcl = NbAcl::CreateAclForAuthenticated();

6.4. オブジェクトの更新

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

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

また、PartUpdateObject()を使用することもできます。 引数にNbJsonObjectをとるので、一部のフィールドのみを更新する用途に適しています。

NbObject object = bucket1.NewObject();
object["keyA"] = "save";
// オブジェクトの新規作成
NbResult<NbObject> resultSave = object.Save();
if(resultSave.IsSuccess()) {
    NbObject savedObject = resultSave.GetSuccessData();

    std::cout << "[Save] keyA : " << savedObject["keyA"] << std::endl;

    savedObject["keyA"] = "save2";

    // オブジェクトの更新
    NbResult<NbObject> resultSave2 = savedObject.Save();
    if(resultSave2.IsSuccess()) {
        NbObject savedObject2= resultSave2.GetSuccessData();

        std::cout << "[Update] keyA : " << savedObject2["keyA"] << std::endl;

        // 部分更新で指定するNbJsonObjectを生成
        NbJsonObject updateData;
        updateData["keyA"] = "partUpdate";

        // オブジェクトの "keyA"を部分更新
        NbResult<NbObject> resultUpdate = savedObject2.PartUpdateObject(updateData);
        if (resultUpdate.IsSuccess()) {
            NbObject updatedObject = resultUpdate.GetSuccessData();

            std::cout << "[PartUpdate] keyA : " << updatedObject["keyA"] << std::endl;

        }
    }
}

この結果、KeyAに対するValueは以下のように更新されます。

[Save] keyA : "save"
[Update] keyA : "save2"
[PartUpdate] keyA : "partUpdate"

注釈

PartUpdateObject()では、サーバに保存されていないオブジェクトを更新することはできません。Save()を使用してください。

6.5. オブジェクトの削除

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

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

NbResult<NbObject> resultDelete = updatedObject.DeleteObject(false);

第一引数がtrueの場合、オブジェクトに削除マークを付与します。後からクエリでオブジェクトの情報を参照することができます。処理結果には更新されたオブジェクトが格納されます。 falseの場合、オブジェクトを完全に消去します。処理結果は空となります。