データベースにはRDBMSとRDBMS以外のNoSQLがあるが、NoSQLは今まで使ったことがなかったので使ってみた。

NoSQLデータベースの中でも比較的人気なMongoDBを導入した。

NoSQLとは

RDBMSがリレーショナルモデルで管理するデータベースであるのに対して、NoSQLはリレーショナルモデルを用いない。

NoSQLは以下の分類に分けられる。

  • キー・バリュー型: キーとバリューだけの単純な構造のデータベース。
  • カラム指向型: キー・バリューがカラムによってグループ化されているデータベース。
  • ドキュメント指向型: JSONやXMLといったドキュメントで管理するデータベース。
  • グラフ指向型: ノード間の関係を管理するデータベース。

MongoDBとは

MongoDBはドキュメント指向型に分類され、BSON(バイナリ型JSON)と呼ばれるデータフォーマットを利用している。

複数のBSONはコレクションと呼ばれる単位で管理される。

扱うデータの種別によって、RDBMSに比べCRUD処理を高速に行えるメリットがある。

環境

導入

インストール

公式のインストール手順に沿ってインストールしていく。

$ brew tap mongodb/brew
$ brew update
$ brew install [email protected]

パスを通す。

$ echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.zshrc

Macのシステム起動時に自動起動させたい場合は、Homebrewのサービスに設定しておく。

$ brew services start mongodb/brew/[email protected]

使い方

シェルの起動

$ mongo
MongoDB shell version v4.4.13
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("hoge") }
MongoDB server version: 4.4.13
> 

MongoDBはデフォルトポート27017で立ち上がる。

データベースの作成/切り替え

> use blog
switched to db blog

データベースの状態

> db.stats()
{
        "db" : "blog",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "totalSize" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "scaleFactor" : 1,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

コレクション(テーブル)作成

> db.createCollection('posts');
{ "ok" : 1 }

ドキュメント(レコード)追加

> db.posts.insert({ title: 'テスト記事', text: 'テスト記事の本文' });
WriteResult({ "nInserted" : 1 })

ドキュメント(レコード)取得

MongoDBでは、_idが主キーとして扱われる。

> db.posts.find({_id: ObjectId("626533b0dda7edc966d8f1e0")});
{ "_id" : ObjectId("626533b0dda7edc966d8f1e0"), "title" : "テスト記事", "text" : "テスト記事の本文" }

ドキュメント(レコード)更新

updateの第1引数が検索条件、第2引数が更新内容となる。

> db.posts.update({_id: ObjectId("626533b0dda7edc966d8f1e0")}, { title: 'テスト記事_更新', text: 'テスト記事の本文_更新' });

ドキュメント(レコード)削除

> db.posts.remove({_id: ObjectId("626533b0dda7edc966d8f1e0")});