ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。たまに技術と関係ないことも書きます。

Data Explorer を使って Cosmos DB にデータを登録/検索する方法

f:id:masatsuna:20200412225312p:plain

前回、 Cosmos DB Emulator を使って、ローカルマシン上で Cosmos DB を実行する方法について解説しました。 また記事の最後の方で、データベース、コンテナーを作成する手順を解説しました。

tsuna-can.hateblo.jp

今回はその続きということで、作成したデータベース、コンテナーにデータを登録/検索する方法を解説しようと思います。

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] を選択します。

f:id:masatsuna:20200411171958p:plain
Data Explorer の起動

ブラウザーが起動して Cosmos DB Emulator 用の Data Explorer が表示されます。

データを登録する

続いて前回作成したデータベース、コンテナーにデータを登録していきましょう。 左側のメニューから [Explorer] を選択します。 前回作成したデータベース(CosmosDbSampleDatabase)、コンテナー(Books)を開いて、 [Items] を選択し、上部の [New Item] ボタンを押下します。

f:id:masatsuna:20200411174533p:plain
データの登録を開始

すると、右側の画面に登録するデータを書き込むエディターが表示されます。

f:id:masatsuna:20200411174613p:plain
エディターの起動

Cosmos DB は、リレーショナルデータベースのように、事前にテーブル定義を行って、データの形式を整えてから使うようなデータベースではありません。 登録するデータは JSON 形式で記載し、設定する属性は登録時に自由に定めることができます。 コンテナーはリレーショナルデータベースでいうところのテーブルと同じようなものですが、仕組みはまるで異なるものです。

今回作成しているコンテナーは書籍のコンテナーですので、書籍に関するデータを JSON 形式で記載しました。 ISBN コード、書籍名、価格、著者のリストを今回は属性として設けてみました。 JSON 形式で記載できるため、著者のリストのように、 1 つのレコード内に、著者のリストのような配列要素を持たせることもできます。 なお id 属性は、必須で定義しなければならない属性です。 リレーショナルデータベースでいうところの主キーを設定しましょう。 入力が完了したら、上部の [Save] ボタンを押下しましょう。

f:id:masatsuna:20200411174731p:plain
登録する JSON を記載

JSON のフォーマット誤りなど、入力値に誤りがあると、 [Save] ボタンが非活性状態になり押下できません。 たぶん一番ハマるのは、 JSON の Trailing Comma がフォーマットエラーとして取り扱われることです*1

正常に登録が完了すると、以下のようにデータが参照できるようになります。

f:id:masatsuna:20200411174819p:plain
登録完了

実際に登録されたデータを見ると、いくつか登録していないデータが登録されていることがわかります。 この半角アンダースコア始まりの属性は、 Cosmos DB の内部管理用データで、ユーザーが意識するものではありません。 それぞれが何を表しているかは、以下にまとまっていますので、興味のある方はどうぞ。

docs.microsoft.com

データを検索する

検索を試すのにあたって、検索対象のデータが 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 句を追加することができます。

f:id:masatsuna:20200412154423p:plain
[Edit Filter] ボタンを押下

例えば価格が 2000 以上のデータを検索する場合は、以下のように WHERE 句を入力して、右側にある [Apply Filter] ボタンを押下します。

SELECT * FROM c JOIN a IN c.price >= 2000

f:id:masatsuna:20200412174408p:plain
価格が 2000 以上のデータを検索

ちゃんと価格が 2000 以上のデータが抽出できています。 この辺りはリレーショナルデータベースの SQL クエリと同じような感覚で使えると思います。

f:id:masatsuna:20200412174537p:plain
価格 2000 以上の検索結果

配列要素の中の値でデータを抽出する

続いてもう少し複雑な検索もしてみます。 著者の属性には、配列のデータを配置していました。 例えば著者の名前(著者 花子)で検索する場合は、以下のようなクエリを記載します。

SELECT * FROM c JOIN a IN c.authors WHERE a.name = "著者 花子"

配列にした属性は、通常のリレーショナルデータベースでいうところの別テーブル扱いであると考えましょう。 SQL も上記に示す通り、 JOIN を使うことがポイントです。 これを適用すると、以下の通り期待通りのデータを抽出できます。

f:id:masatsuna:20200412175655p:plain
JOIN 句を使った検索結果

まとめ

今回は Cosmos DB Emulator に付属する Data Explorer を用いて、データの登録と検索を行う方法についての基本を書きました。 対象が Azure 上の Cosmos DB であってもやり方はほとんど同じですので、いろいろ遊んでみてください。

*1:これ本気で何とかしてほしい。。。