2.2. JSONオブジェクトストレージ¶
2.2.1. オブジェクトクエリ¶
ソート条件¶
- オブジェクトクエリにソート条件を指定する場合、原則ソートに使用するキーに対してインデックスを指定してください。
- インデックスを設定しない場合、ソート対象のデータ量は32MB以内に収める必要があります。この制限を超えると、クエリはエラーとなります。
クエリ条件式¶
- ブラウザから JavaScript SDK を使用してクエリ式を発行する際、クエリ式が非常に大きいと(概ね2KB程度以上)、URLが長くなりすぎブラウザによってはリクエスト送信が失敗する場合があります。
- この場合は、v5 より新規追加されたロングクエリ API を使用してください。ロングクエリ API では、HTTP GET の代わりに POST が使用されるため、クエリ式の長さの制限はありません。
- クエリ条件式は URL に含まれサーバのアクセスログに保存されるため、機密情報を条件式に含めないようにしてください。
- どうしても機密情報を含めざるを得ない場合は、ロングクエリAPIを使用してください。
大量データのクエリ¶
- 大量のデータに対してクエリを行う場合は、適切にインデックスを設定してください。
- インデックスを設定せずに大量データにクエリをかけると、MongoDB サーバに多大な負荷がかかり、応答が返ってこない場合があります。
- このようなクエリをかけてしまった場合の対処として、MongoDB のデフォルトクエリタイムアウト時間を設定することを推奨します。
- タイムアウト時間は、デベロッパーコンソールの「システム設定」より設定できます。
- クエリ処理がこの時間を超えた場合、クエリは中断されクライアントには 408 Request Timeout エラーが返却されます。
2.2.2. オブジェクト削除¶
物理削除と論理削除¶
オブジェクトストレージのオブジェクト削除動作は、SDK によって動作が異なります。
- Java / Android SDK: 論理削除のみ
- JavaScript SDK: オフライン機能非使用時は物理削除、オフライン機能使用時は論理削除
- iOS SDK: 物理削除のみ
- .NET SDK, Python SDK: 物理削除・論理削除ともサポート (API引数で指定)
物理削除した場合は MongoDB 上から即時にオブジェクトが削除されますが、論理削除したオブジェクトは MongoDB 上にはデータとして残ったままの状態となります。
- 論理削除状態のオブジェクトデータは、オフライン機能使用時に削除状態をクライアントに通知するために必要となります。
- 論理削除状態のオブジェクトが残っていても動作上問題はありませんが、ストレージ容量を専有します。物理的に消去するには、定期削除機能を使用するか、明示的に物理削除 API を呼び出して削除する必要があります。詳細な手順を次節以降で説明します。
論理削除オブジェクトの自動定期削除¶
モバイルバックエンド基盤サーバ ver 4.0.1 より、論理削除オブジェクトの自動定期削除機能が追加されています。
- 1時間に1回の頻度で、サーバ側で論理削除オブジェクトの削除処理が実行されます。
- デベロッパーコンソールより、テナント単位で論理削除オブジェクトの有効期限を設定できます。なお、デフォルトでは削除は行わないよう(有効期限が無限大)になっていますので、定期削除を行いたい場合は設定を変更してください。
論理削除オブジェクトの手動一括削除手順¶
論理削除オブジェクトを手動削除する手順を示します。
.NET SDK では一括削除 API が用意されていますので、こちらを使用してください。 他の SDK は現時点では提供していませんので、直接 REST API を発行してください。
削除条件としては以下の指定を行ってください。
- 論理削除されていること (“_deleted” フィールドが true である)
また、以下の指定を行うことで、一定期間経過したオブジェクトを指定して削除できます。
- "updatedAt" が特定の日時以前である。
以下、例を示します。この例では 2016/3/1 00:00:00 (UTC) 以前の論理削除オブジェクトを物理削除します。
//.NET SDK の場合の例
var query = new NbQuery().DeleteMark(true).LessThan("updatedAt", "2016-03-01T00:00:00.000Z");
await bucket.DeleteAsync(query, false);
// REST API 呼び出し(curl)の場合の例
// {} 内の文字列は適宜適切な値を代入してください
curl –X DELETE \
-H "X-Application-Id: {appId}" \
-H "X-Application-Key: {masterKey}" \
--data-urlencode 'where={"_deleted": true, "updatedAt": {"$lt": "2016-03-01T00:00:00.000Z"}} ' \
https://{server}/api/1/{tenant_id}/objects/{bucketName}
2.2.3. リクエストトークン¶
リクエストトークンの仕様¶
直接 REST API を用いて、オブジェクトの作成・バッチリクエストを行う場合、リクエストトークンを指定することができます。
クライアント側から requestToken を指定した場合、サーバはレスポンスをキャッシュします。同一 requestToken を持つリクエストが再送された場合、サーバは処理を行わずキャッシュしたレスポンスのみを返却します。
リクエストトークンを利用する場合の注意点¶
同一requestTokenでのリクエストが非常に短い間隔で再送された場合には、処理が重複して行われる可能性があります。
これは、ネットワークエラーなどによりレスポンス取得に失敗した場合の再送処理対応が本来の目的であり、短時間での連続送信は目的外であるためです。 SDKを利用する場合は、SDK内で考慮されるため問題ありません。