Amazon DynamoDBは高速な完全マネージド型 NoSQL データベースサービスです。 簡単にテーブルを作成し、お望みの量の読み込みおよび書き込みキャパシティをプロビジョンし、好きなだけ多くの情報を格納することができます。 DynamoDBのテーブル内の各アイテムは1つ以上のキー/バリューのペアで構成されていて、ハッシュキーもしくはハッシュキーとレンジキーを組み合わせたものをインデックス化します。(さらに詳しい情報についてはDynamoDBのデータモデルをご覧ください。) また、追加のインデックスオプションとして、ローカルおよびグローバルセカンダリインデックスという機能も搭載しています。
DynamoDBのようなNoSQLデータベースは、拡張性と一貫性があり、高いパフォーマンスを実現するように設計されています。 これらの属性が、柔軟性と普遍性と比べて必ずしも重要でない従来のリレーショナルデータベースも出るとは著しく対照的です。
本日、クエリ結果のフィルタリングと、既存のアイテムの更新オプションを追加することにより、DynamoDBをより柔軟にご利用いただけるようになりました。 それでは見てみましょう!
クエリのフィルタリング
DynamoDBのクエリー機能は主キーもしくは、ローカルまたはグローバルセカンダリーインデックスからのインデックスキーを使ってアイテムを取得します。 各クエリはブール比較演算子を使用して、返されるアイテムを制御することができます。
本日のリリースで、主キーでない属性でのクエリーフィルタリングをサポートすることで、このモデルを拡張しています。 Query機能を呼び出す際に、QueryFilterを含むことができます。 フィルターは、キーベースの取得の後、結果が返される前に適用されます。この方法でのフィルタリングを使うことにより、コードを簡単にし、効率化しつつ、アプリケーションに返されるデータの量を減らすことができます。
Query APIに渡すQueryFilterは1つ以上の条件を含む必要があります。 各条件は、属性名を参照し、比較演算子と一緒に1つ以上の属性値を含みます。通常のブール比較演算子に加えて、文字列マッチのために、CONTAINS、 NOT_CONTAINS、BEGINS_WITH を、範囲チェックのためにBETWEEN、セット内に存在するかを確認するために、INを使用することができます。
QueryFilterに加えて、ConditionalOperatorを渡すこともできます。 この論理演算子(ANDかOR)はQueryFilter内の各要素をつなげるために使われます。
アイテムの更新
DynamoDBのPutItem、UpdateItem、 DeleteItem機能 が、必要に応じて、アイテムの条件付き更新を実行することができるようになりました。 この機能を使えば、2つ以上のプロセスが、制御された方法で特定のアイテムへの同時更新を行うことができるようになります。 センサーネットワークから流れてくるリアルタイムデータを追跡するために、2つのDynamoDBテーブルを使っているとしましょう。 UpdateItem機能を使って、スケーラブルな方法で、信頼性の高いカウントシステムを実装することができます。 コードは次のようにします。:
- アイテムを読み込みためにGetItemを呼び出します。
- アイテムからcountフィールドを抽出し、1インクリメントします。
- countフィールドの現在と新しい値でUpdateItemを呼び出します。
- UpdateItemが、現在の値が正しくないことを示している場合、ステップ1に戻ります。
本日のリリースでは、置換(put)、更新、または削除されるアイテムのために保持しなければならない条件を指定するための、追加のオプションがあります。 ANDまたはORでつなぐことにより、複数の条件を指定することもできます。
たとえば、残高が引き出す量より大きいまたは等しい場合にのみ、 銀行の残高から金額を差し引くことができます。
.NET、Ruby、Java、JavaScript用のAWS SDKはアップデートされていますので、これらの強力な新機能を今すぐご利用いただけます。Python、PHPのSDKについても数日のうちにアップデートする予定です。
DynamoDB Localもアップデートされています。最新版はこちらからダウンロードいただけます。
-- Jeff;
この記事はAWSシニアエバンジェリスト Jeff BarrのAmazon Web Services Blogの記事、 Improved Query Filtering and Conditional Updates for DynamoDBを 堀内康弘 (Facebook, Twitter)が翻訳したものです。