前回、 Cosmos DB Emulator を使って、ローカルマシン上で Cosmos DB を実行する方法について解説しました。 また記事の最後の方で、データベース、コンテナーを作成する手順を解説しました。
今回はその続きということで、作成したデータベース、コンテナーにデータを登録/検索する方法を解説しようと思います。
Cosmos DB には、いくつかの API が提供されています。 もっとも一般的なのが SQL API です。 他には、MongoDB API 、 Cassandra API などがあります。
Cosmos DB Emulator は、何もオプションを指定しないで実行すると、 SQL API が使われるようになっています。 また前回紹介した Data Explorer は、 SQL API のみをサポートしています(2020/4/12 現在)。 今回は Data Explorer を使ってデータの登録、検索をやっていきますので、 SQL API を使います。
Data Explorer の起動
まずはスタートメニューから [Azure Cosmos DB Emulator] を起動しましょう。 起動後に表示される右下のアイコンから [Open Data Explorer] を選択します。
ブラウザーが起動して Cosmos DB Emulator 用の Data Explorer が表示されます。
データを登録する
続いて前回作成したデータベース、コンテナーにデータを登録していきましょう。 左側のメニューから [Explorer] を選択します。 前回作成したデータベース(CosmosDbSampleDatabase)、コンテナー(Books)を開いて、 [Items] を選択し、上部の [New Item] ボタンを押下します。
すると、右側の画面に登録するデータを書き込むエディターが表示されます。
Cosmos DB は、リレーショナルデータベースのように、事前にテーブル定義を行って、データの形式を整えてから使うようなデータベースではありません。 登録するデータは JSON 形式で記載し、設定する属性は登録時に自由に定めることができます。 コンテナーはリレーショナルデータベースでいうところのテーブルと同じようなものですが、仕組みはまるで異なるものです。
今回作成しているコンテナーは書籍のコンテナーですので、書籍に関するデータを JSON 形式で記載しました。 ISBN コード、書籍名、価格、著者のリストを今回は属性として設けてみました。 JSON 形式で記載できるため、著者のリストのように、 1 つのレコード内に、著者のリストのような配列要素を持たせることもできます。 なお id 属性は、必須で定義しなければならない属性です。 リレーショナルデータベースでいうところの主キーを設定しましょう。 入力が完了したら、上部の [Save] ボタンを押下しましょう。
JSON のフォーマット誤りなど、入力値に誤りがあると、 [Save] ボタンが非活性状態になり押下できません。 たぶん一番ハマるのは、 JSON の Trailing Comma がフォーマットエラーとして取り扱われることです*1。
正常に登録が完了すると、以下のようにデータが参照できるようになります。
実際に登録されたデータを見ると、いくつか登録していないデータが登録されていることがわかります。 この半角アンダースコア始まりの属性は、 Cosmos DB の内部管理用データで、ユーザーが意識するものではありません。 それぞれが何を表しているかは、以下にまとまっていますので、興味のある方はどうぞ。
データを検索する
検索を試すのにあたって、検索対象のデータが 1 件だと面白くないので、 3 件のデータを登録しておきました。 なお著者のデータは、前述の通り配列データとしてあります。
id | isbnCode | name | price | authors |
---|---|---|---|---|
B00001 | 978-4-00-000000-0 | 素晴らしい本 | 2500 | 著者 太郎, 著者 花子 |
B00002 | 978-4-00-000001-0 | そこそこの本 | 2000 | 著者 次郎 |
B00003 | 978-4-00-000002-0 | 普通の本 | 1800 | 著者 花子 |
単純なデータの抽出
では実際に検索を行っていきましょう。 データ登録時と同様に、左側のコンテナーを開いて [Items] を選択します。 この状態だと、登録した全データが表示されます。
この時表示しているデータは、上部に表示されている SQL によって検索したデータです。 初期状態ですと全権検索するクエリが表示されていると思います。 その右側にある [Edit Filter] ボタンを押下すると、 WHERE 句を追加することができます。
例えば価格が 2000 以上のデータを検索する場合は、以下のように WHERE 句を入力して、右側にある [Apply Filter] ボタンを押下します。
SELECT * FROM c JOIN a IN c.price >= 2000
ちゃんと価格が 2000 以上のデータが抽出できています。 この辺りはリレーショナルデータベースの SQL クエリと同じような感覚で使えると思います。
配列要素の中の値でデータを抽出する
続いてもう少し複雑な検索もしてみます。 著者の属性には、配列のデータを配置していました。 例えば著者の名前(著者 花子)で検索する場合は、以下のようなクエリを記載します。
SELECT * FROM c JOIN a IN c.authors WHERE a.name = "著者 花子"
配列にした属性は、通常のリレーショナルデータベースでいうところの別テーブル扱いであると考えましょう。 SQL も上記に示す通り、 JOIN を使うことがポイントです。 これを適用すると、以下の通り期待通りのデータを抽出できます。
まとめ
今回は Cosmos DB Emulator に付属する Data Explorer を用いて、データの登録と検索を行う方法についての基本を書きました。 対象が Azure 上の Cosmos DB であってもやり方はほとんど同じですので、いろいろ遊んでみてください。
*1:これ本気で何とかしてほしい。。。