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

JSON 形式でオブジェクトを保存、読み出しすることができます。

オブジェクトは「バケット」毎に分類されます。 バケットとは、SQL データベースでいうところの「テーブル」に該当する概念で、 同一種類のオブジェクトを格納する入れ物です。

オブジェクトストレージの API エンドポイントは以下の URL となります。

https://{server}/api/1/{tenant}/objects/{bucketName}

4.1. オブジェクトバケットの作成

オブジェクトを格納する前に、オブジェクトバケットを作成しておく必要があります。

バケットの作成はデベロッパーコンソールで行うことができます。 また、REST API や各 SDK から実行することも可能です。

4.2. オブジェクトの作成

curl -X POST \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 -H "Content-Type: application/json" \
 -d '{"name":"Foo", "score":80}' \
 https://{server}/api/1/{tenant}/objects/scores

ここでは scores バケットに JSON オブジェクトを書き込んでいます。

正常にオブジェクトが書き込まれると、200 OK が返り、以下のように作成されたオブジェクトが返却されます。

{
  "_id": "521c36d4ac521e1ffa000007",
  "name": "Foo",
  "score": 80
  "ACL": {
    "r": ["g:anonymous"],
    "w": ["g:anonymous"]
  },
  "createdAt": "2013-08-27T05:19:16.000Z",
  "updatedAt": "2013-08-27T05:19:16.000Z"
}
  • '_id' にはオブジェクトのIDが入ります。
  • 'ACL' には、以下で説明する ACL が入ります。
  • 'createdAt はオブジェクトの作成時刻です
  • 'updatedAt はオブジェクトの更新時刻です

主なステータスコードは以下の通り。

  • 200 OK : 正常登録した
  • 400 Bad Request : パラメータ/リクエストボディ不正
  • 401 Unauthorized : 認証エラー
  • 403 Forbidden :権限エラー
  • 404 Not Found : バケットが存在しない

4.3. アクセス制御

オブジェクトには ACL (Access Control List)を設定することで、アクセス制御 を行うことができます。

ACL は、オブジェクト作成時に 'ACL' キーを指定することで設定します。

ACL キー内の 'owner' キーに、オブジェクトのオーナのユーザIDを指定します。 オーナはオブジェクトの読み書きの権限がすべて与えられます。

ACL キー内の 'r' に読み込み可能なユーザ一覧、'w' に書き込み・削除 可能なユーザ一覧を配列で指定します。

また、グループ名を指定することも可能です。グループ名を指定する場合は "g:groupA" のように先頭に "g:" を付与してください。

なお、ログイン済み全ユーザを表す "authenticated" グループと、 未ログインユーザ全員を表す "anonymous" グループも使用できます。

ユーザ・グループ、いずれかの条件に合致すると、オブジェクトへのアクセスが 許可されます。

{
  "name":"Foo",
  "score":80,
  "ACL": {
    "owner": "52116f01ac521e1742000001",
    "r": ["g:anonymous"],
    "w": ["g:groupA"],
  }
}

上記の例では、誰でも読み込み可能で、書き込みは groupA が可能。 オーナとなる 52116f01ac521e1742000001 ユーザはすべて可能という指定となります。

なお、ACL を指定せずにオブジェクトを作成した場合は、以下のような動作となります。

  • X-Session-Token ヘッダでセッショントークンを送信した状態でオブジェクトを作成すると、そのユーザIDでのみ読み書き可能な状態でオブジェクトが作成されます。
  • X-Session-Token ヘッダが送信されない状態でオブジェクトを作成した場合、誰でも読み書き可能な状態でオブジェクトが作成されます。
  • いずれの場合もグループは指定されません。

4.4. オブジェクトの取得

オブジェクトIDを指定することでデータを読み出します。

curl -X GET \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 https://{server}/api/1/{tenant}/objects/scores/52117490ac521e5637000001

以下のように結果が得られます。

{
  "_id": "52117490ac521e5637000001",
  "name": "Foo",
  "score": 80
  "ACL": {
    "owner": "52116f01ac521e1742000001",
    "r": [],
    "w": []
  },
  "createdAt": "2013-08-27T05:19:16.000Z",
  "updatedAt": "2013-08-27T05:19:16.000Z"
}

createdAt はオブジェクトの作成時刻、updatedAt はオブジェクトの更新時刻です。

主なステータスコードは以下のとおりです:

  • 200 OK : 正常にオブジェクトを取得した
  • 400 Bad Request : リクエストが不正
  • 401 Unauthorized : 認証エラー
  • 403 Forbidden : 読み出し権限がない
  • 404 Not Found : 該当するオブジェクトがない、または読み込み権限がない

4.5. クエリ

以下のようにすると、すべてのオブジェクトのリストを読み出します。 ただし、読み出し権限がないオブジェクトは取得されません。

curl -X GET \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 https://{server}/api/1/{tenant}/objects/scores

結果は、以下のよう、results 内に、配列でオブジェクトが格納された形で得られます。

{
  "results":[
    {
      "_id":"52117490ac521e5637000001",
      "name":"Foo",
      "score":80,
      "ACL": {
        "owner": "52116f01ac521e1742000001",
        "r": [],
        "w": []
      },
      "createdAt": "2013-08-27T05:19:16.000Z",
      "updatedAt": "2013-08-27T05:19:16.000Z"
    }
  ]
}

4.5.1. 条件指定クエリ

条件指定は where= パラメータで行う。

curl -X GET \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 -G \
 --data-urlencode 'where={"name":"Foo"}' \
 https://{server}/api/1/{tenant}/objects/scores

where には JSON でパラメータを指定します。

特定のキーに対して完全一致させたい場合は、以下のように JSON で指定します。

{"name": "Foo"}

比較を行う場合は、以下の演算子を利用できます。

  • $lt, $gt : Less Than / Greater Than
  • $lte, $gte : Less or Equal / Greater of Equal
  • $ne : Not equal to

例) score が 70 超のものを選択したい場合

{"score": {"$gt": 70}}

その他の演算子。これらは MongoDB のクエリがそのまま使用できます。

  • $in
  • $nin
  • $all
  • $regex
  • $exists
  • $not
  • $and
  • $or
  • $nor

4.5.2. 順序指定

順序指定は order パラメータで行います。

curl -X GET \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 -G \
 --data-urlencode 'order=age' \
 https://{server}/api/1/{tenant}/objects/scores

order に指定したキーの昇順でソートされます。

降順にしたい場合は "order=-age" のように "-" を付けてください。

4.5.3. skip / limit

limit で検索件数上限、skip でスキップする検索数を指定できます。

curl -X GET \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 -G \
 --data-urlencode 'skip=100' \
 --data-urlencode 'limit=50' \
 https://{server}/api/1/{tenant}/objects/scores

4.6. 更新

PUT メソッドで、オブジェクトの URI を指定して更新を行います。 オブジェクトの書き込み権限が必要です。

curl -X PUT \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 -H "Content-Type: application/json" \
 -d '{"name":"Foo", "score":90}' \
 https://{server}/api/1/{tenant}/objects/scores/52117490ac521e5637000001

上記書式の場合、指定したフィールドだけが更新されます。 指定していないフィールドは、'updatedAt' 以外更新されません。 ('updatedAt' フィールドは現在時刻に更新されます)

主なステータスコードは以下のとおりです:

  • 200 OK : 正常にオブジェクトを更新した
  • 401 Unauthorized : 認証エラー
  • 403 Forbidden : 書き込み権限がない
  • 404 Not Found : 該当するオブジェクトがない

データの指定方法により、完全上書きと、一部更新の2通りを選択することができます。

4.6.1. 部分更新

オブジェクトの一部のみを更新する方法です。

以下は、score を 80 に変更する例です。 指定していないフィールドは変更されません。

{"score": 80}

$set 演算子を使用することも可能です。

{"$set": {"score": 80}}

$inc 演算子を使用すると、インクリメントを行うことができます。

{"$inc": {"score": 10}}

他に、 MongoDB の更新演算子 がすべて使用できます。

注釈

updatedAt は、現在時刻で更新されます。 また、etag は自動的に変更されます。

4.6.2. 完全上書き

完全上書きを行う場合は $full_update 演算子を使用します。

{"$full_update": {"name":"Bar", "score":90, "ACL": {"owner":"xxx", "r":[], "w":[]}}}

この方法では、指定したデータでオブジェクトが置き換えられます。

注意

指定されなかったフィールドは削除されます。 また、ACL を指定しない場合は 400 Bad Request エラーとなります。

注釈

updatedAt は、現在時刻で更新されます。 createdAt は、指定しない限り元の値が維持されます。 また、etag は自動的に変更されます。

4.7. 削除

DELETE メソッドで、オブジェクトの URI を指定して削除を行います。 オブジェクトの書き込み権限が必要です。

curl -X DELETE \
 -H "X-Application-Id: {app_id}" \
 -H "X-Application-Key: {app_key}" \
 https://{server}/api/1/{tenant}/objects/scores/52117490ac521e5637000001

主なステータスコードは以下のとおりです:

  • 200 OK : 正常にオブジェクトを削除した
  • 401 Unauthorized : 認証エラー
  • 403 Forbidden : 書き込み権限がない
  • 404 Not Found : 該当するオブジェクトがない