MACへのMongoDBのインストール手順だけではなくデータベースの作成からCRUDの方法も一通り説明を行なっているので、MySQLなどの使用経験がある人なら操作方法の違いも理解することができます。

MACのバージョンは、macOS Mojave 10.14.6、MongoDBのバージョンはv4.2.0です。

MongoDBとは

MongoDBはMySQLやOracleのようなリレーショナルデータベースとは異なりNoSQLデータベースとして分類されドキュメント指向データベースと呼ばれています。データベースへのデータの保存はキーと値によるJSONフォーマットのような形式で行います。Windows, Linux, MAC等プラットフォームにインストールでき、さまざまなプログラム言語のドライバが提供されています。

NoSQLはNot SQLではなくNot Only SQLという意味です。

MongoDBのインストールと初期設定

MongoDBのMACへのインストールはMongoDBの公式マニュアルを参考に行なっています。

Homebrewを使ったインストール

Homebrewを使ってインストールを行うため、Homebrewがインストールされていない場合は下記を参照にインストールを行なってください。

MongoDBは公式のMongoDBソフトウェアのTapが準備されているので、まずTapのインストールを行います。

TapをインストールすることでHomebrewでインストール可能なソフトウェアを増やすことができます。

$ brew tap mongodb/brew

tapのインストールが完了したmongodb-communityをインストールします。インストールのログに起動方法等が表示されるので、確認しておきましょう。


$ brew install mongodb-community
 ・
 ・
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb-community/4.2.0: 21 files, 272.3MB, built in 42 seconds

mongodbの設定ファイルが/usr/local/etc/mongod.confに作成されます。

中身を確認するとログとデータベースの保存先のパスが記述されています。


systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1

バーションの確認

インストールにバージョンを指定していため、どのバージョンがインストールさえれているかわからない場合は下記のコマンドで確認することができます。


$ mongod --version
db version v4.2.0
git version: a4b751dcf51dd249c5865812b390cfd1c0129c30
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64
mongoコマンドでMongoDBに接続した時もバージョンは表示されます。

起動・停止方法の確認

再起動してもmongdbのバックグランドプロセスを自動起動させたい場合は、brew services startコマンドを実行します。


$ brew services start mongodb-community

サービスを停止したい場合は以下のbrew services stopコマンドを実行します。


$ brew services stop mongodb-community

手動で起動したい場合は、設定ファイルを指定して起動を行います。指定しなければ/data/dbをデータディレクトリのパスとして利用します。


$ mongod --config /usr/local/etc/mongod.conf

手動で起動した場合は起動を実行したコンソールでCtrl + Cでコマンドを終了させることでMongoDBを停止することができます。

MongDBへの接続

MongoDBへ接続するためには、MongoDBを起動させておく必要があります。


$ brew services start mongodb-community
==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-comm

ローカルのMongDBへの接続はmongoコマンドで行うことができます。


$ mongo
もし、MongoDBが起動していない場合は、
Error: couldn’t connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
といったエラーがコンソールに表示されます。

MongoDBのデフォルトのポートは、27017に設定されています。

データベースの操作

データベースの確認

mongoコマンドでMongoDBに接続したあと、コマンドを使ってMongoDBを操作することができます。

show dbsコマンドを実行するとMongoDBのデフォルトに存在するデータベースを作成することができます。


> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

MongoDBのデータ構造

SQLデータベースでは、データベースを作成すると次にテーブルを作成し、テーブルの中に行を作成していきます。

MongoDBの場合は、データベースは同じですが、テーブルではなくコレクション、行ではなくドキュメントという単位でデータを作成していきます。

データベースの作成

データベースの作成はuse “データベース名”を使います。データベース名がMongoDBの中に存在している場合は、useで指定したデータベースに接続し、もしなければデータベースを作成します。


> use test_db
switched to db test_db

接続しているデータベースはdbコマンドを確認することができます。useを実行した際にswitched to db test_dbでtest_dbに接続しているので、test_dbと表示されます。


> db
test_db

作成したデータベースを確認するためにshow dbsコマンドを実行します。


> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

しかし、test_dbはshow dbsコマンドで表示されません。show dbsコマンドでtest_dbを表示させるためには、コレクションを追加する必要があります。コレクションは、createCollectionコマンドで作成することができます。


> db.createCollection("users")
{ "ok" : 1 }

コレクションが作成できればshow dbsコマンドでデータベースを確認することができます。


> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB

データベースの削除

作成したデータベースを削除したい場合は、削除したいデータベースに接続して、db.dropDatabaseコマンドを実行します。


> use test_db
switched to db test_db
> db.dropDatabase();
{ "dropped" : "test_db", "ok" : 1 }

ドキュメントの作成

コレクションを作成したので、実際のデータであるドキュメントをコレクション内に作成します。1つのドキュメントを作成するためinsertOneコマンドを実行します。

これまでSQLデータベースに慣れしている人であれば、列名やデータタイプを設定していないのにデータ作成できるのかという疑問を持つかと思います。しかし、MongoDBでは事前にそのような設定を行う必要はありません。

> db.users.insertOne({ name: "John Doe", age: 30})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5d941d8020153c73fb1b1acf")
}
insertOneコマンドを実行した時にもしusersコレクションが存在しない場合は、その時に一緒に作成してくれます。個別にコレクションを作成する必要はありません。

作成したデータはfindコマンドで確認することができます。


> db.users.find()
{ "_id" : ObjectId("5d941d8020153c73fb1b1acf"), "name" : "John Doe", "age" : 30 }

さらにもう一つデータを追加しますが、キーと値のペアをもう一つ増やします。それでもエラーなしに追加することができます。


> db.users.insertOne({ name: "Kevin", age: 35, email: "kevin@test.com"})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5d942a7f605322e0a5102ad9")
}

再度findコマンドを実行するとキーの数の異なるドキュメントが表示されます。


> db.users.find()
{ "_id" : ObjectId("5d941eb320153c73fb1b1ad0"), "name" : "John Doe", "age" : 30 }
{ "_id" : ObjectId("5d942a7f605322e0a5102ad9"), "name" : "Kevin", "age" : 35, "email" : "kevin@test.com" }

findで表示される内容をきれいにしたい場合は、prettyを追加します。


> db.users.find().pretty()
{
	"_id" : ObjectId("5d941eb320153c73fb1b1ad0"),
	"name" : "John Doe",
	"age" : 30
}
{
	"_id" : ObjectId("5d942a7f605322e0a5102ad9"),
	"name" : "Kevin",
	"age" : 35,
	"email" : "kevin@test.com"
}

ドキュメントの表示

findコマンドを使うとコレクションに保存されているすべてのドキュメントが表示されます。ObjectIdを使って、コレクションを表示させたい場合は、下記のように実行します。


> db.users.find(ObjectId("5d942a7f605322e0a5102ad9")).pretty()
{
	"_id" : ObjectId("5d942a7f605322e0a5102ad9"),
	"name" : "Kevin",
	"age" : 35,
	"email" : "kevin@test.com"
}

キーを使って表示する場合は、キーと値を使って行います。


> db.users.find({ "name" : "Kevin"}).pretty()
{
	"_id" : ObjectId("5d942a7f605322e0a5102ad9"),
	"name" : "Kevin",
	"age" : 35,
	"email" : "kevin@test.com"
}

ドキュメントの削除

ドキュメントを1件削除するにはdeleteOneを使います。コレクション全体をfindで確認し、指定したドキュメントが削除されているか確認します。


> db.users.deleteOne({ "name" : "Kevin"})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.users.find()
{ "_id" : ObjectId("5d941eb320153c73fb1b1ad0"), "name" : "John Doe", "age" : 30 }

ドキュメントの更新

nameがJohn Doeのageを30から45に変更しています。updateの前後にfindコマンドを実行し、更新が正常に行われているか確認しています。

updateには下記のように$setを使って行います。


> db.users.find().pretty()
{
	"_id" : ObjectId("5d941eb320153c73fb1b1ad0"),
	"name" : "John Doe",
	"age" : 30
}
> db.users.update({"name":"John Doe"},{$set: {"age":45}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find().pretty()
{
	"_id" : ObjectId("5d941eb320153c73fb1b1ad0"),
	"name" : "John Doe",
	"age" : 45
}