NoSQL(2)・ドキュメント指向データベース

Image from Gyazo

ドキュメント指向データベース

ドキュメント指向データベース(Document-Oriented Database) は, ドキュメント形式のデータをそのまま格納することができるデータベースです. ここで,ドキュメント形式とは,JSON形式XML形式 のことを指しています. Key-Valueストア型データベースに比べて, 階層構造など柔軟なデータ構造に対応が可能です. また,Javaに代表されるオブジェクト指向のプログラミング言語では, データをオブジェクトという単位で管理することが多く, このオブジェクトをJSONに変換して, データベースに格納することができるというメリットがあります.

JSON

JSON(JavaScript Object Notation) はJavaScriptのオブジェクト表現を基にしたデータ形式です. 基本的にはキー(Key)とバリュー(Value)の組み合わせでデータを列挙します. 下記の例では,キーは name,バリューは 岩村優 です. キーとバリューのいずれも,ダブルクオーテーションで括る必要があることに注意してください. また,バリューには,文字列,数値,オブジェクト,配列などを指定することができます.

{
	"name": "岩村優",
	"age": 21,
	"faculty": "工学部",
	"hobby": ["テニス","読書"]
}

XML

XML(Extensibile Markup Language は, ウェブページを記述するHTMLと同様の マークアップ言語 の一つです. 要素(Element)と属性(Attribute)によって構成され, 階層的に記述することが可能なデータ形式です. 下記の例では,studentname が要素であり, age は属性を表しています. 要素は,開始タグ(<要素名>)で始まり,終了タグ(</要素名>)で終わる必要があります.

<student>
	<name age="21">岩村優</name>
	<faculty>工学部</faculty>
	<hobbies>
		<hobby>テニス</hobby>
		<hobby>読書</hobby>		
	</hobbies>
</student>

代表的なドキュメント指向データベースには下記があります. ここでは,JSON形式のドキュメントを格納可能な MongoDB に着目します.

MongoDB

MongoDBのインストール

Windowsの場合

Windows版は,公式サイトからダウンロードしましょう. ここで,ダウンロードするパッケージは,Community Serverです (企業用の Enterprise Server を選択しないように注意). また,パッケージは ZIP を選択してください.

Windows版 MongoDBのダウンロード

Image from Gyazo

MacOSの場合

MacOSでは,HomeBrewを利用してインストールするのが簡単です. brew tapでレポジトリを追加してから,最新バージョンの4.2をインストールします(2019年11月時点). Homebrewのインストールに関しては,他のサイトを参考にしてください.

% brew tap mongodb/brew
% brew install mongodb-community@4.2

MongoDBの起動

Windowsの場合

最初にMongoDBがデータを保存するフォルダを作成します. Windowsの場合はc:\data\dbというフォルダを作成します.

% mkdir c:\data\db

サーバは mongod,クライアントは mongoです. コマンドプロンプトやPowerShellで下記のコマンドを実行します(Shiftキーを押しながら右クリックで起動できる).

% mongod
% mongo

MacOSの場合

最初にMongoDBがデータを保存するフォルダを作成します. MacOSの場合はホームディレクトリに~/data/dbというディレクトリ(フォルダ)を作成します.

% mkdir ~/data/db

サーバは mongod,クライアントは mongoです. データの保存先を指定するため,--dbpathで先程作成したディレクトリを指定します.

% mongod --dbpath data/db
% mongo

MongoDBのコマンド

データベースの作成

データベースを作成するには use を利用します. ここでは,mydbという名前のデータベースを作成します.

> use mydb

現在使用しているデータベースを確認するには db と入力します.

> db

Image from Gyazo

コレクションの作成

リレーショナルデータベースのテーブルに相当するコレクション を作成します. ここでは,studentsという名前のコレクションを作成します.

> db.createCollection("students")

データベースに存在するコレクションの一覧を表示するにはshow collectionsと入力します.

> show collections

Image from Gyazo

ドキュメントの登録

コレクションにドキュメントを登録するにはinsertを利用します. 登録するドキュメントはJSON形式であり,事前にスキーマを定義する必要はありません. このため,下記のように異なるキーを持つデータを登録することが可能です.

> db.students.insert({
	"name": "岩村優",
	"age": 21,
	"faculty": "工学部",
	"hobby": ["テニス","読書"]
})

> db.students.insert({
	"name": "仙波あすか",
	"faculty": "国際関係学部",
	"grade": 1
})

Image from Gyazo

ドキュメントの取得

コレクションに登録されているドキュメントの一覧を表示するにはfindを利用します. 登録されたドキュメントには _id というキーが追加されていることがわかります. これは,リレーショナルデータベースにおける主キーに相当します.

db.students.find()

Image from Gyazo

条件を指定して特定のドキュメントを抽出するには, findの引数として条件を表すJSON形式のドキュメントを与えます. 下記の例ではname岩村優という条件を指定しています.

db.students.find({"name": "岩村優"})

Image from Gyazo

特定のキーのみを取得するには,抽出条件の後に, 取得したいキーをJSON形式で列挙します(バリューは1に設定する).

db.students.find({"name": "岩村優"},{"name": 1, "hobby": 1})

Image from Gyazo

ドキュメントの削除

ドキュメントを削除するにはremoveを利用します. 条件の指定はfindと同じです.

db.students.remove({"name": "岩村優"})

Image from Gyazo

参考書籍