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

Macのバージョンは、macOS Big Sur 11.4, MongoDBのバージョン4.4.5です。本文書公開当時のMACのバージョンはmacOS Mojave 10.14.6、MongoDBのバージョンはv4.2.0でした。

ローカルのMongoDBを利用したくないという人であればクラウドベースのMongoDBを利用するという選択肢もあります。

MongoDBとは

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

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

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

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

Homebrewを使ったインストール

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

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

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

$ 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に作成されます。

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


 %  more /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.4.5
Build Info: {
    "version": "4.4.5",
    "gitVersion": "ff5cb77101b052fa02da43b8538093486cf9b3f7",
    "modules": [],
    "allocator": "system",
    "environment": {
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}
mongoコマンドでMongoDBに接続した時もバージョンは表示されます。
fukidashi

起動・停止方法の確認

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


$ brew services start mongodb-community

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


$ brew services stop mongodb-community

起動しているかどうはbrew services listから確認することができます。特にMacでは本番ではなく開発のために利用すると思うので無駄なリソースを使わないためにも不必要なサービスが起動している場合はサービスを停止するようにしてください。

手動で起動したい場合は、設定ファイルを指定して起動を行います。指定しなければ/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コマンドで行うことができます。接続時にもMongoDBのバージョンが表示されます。


$ mongo
MongoDB shell version v4.4.5
・
・
もし、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 :
といったエラーがコンソールに表示されます。
fukidashi

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コマンドで作成することができます。実行結果はJSONで戻されていることも確認できます。


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

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


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

コレクションの確認

接続しているデータベースのコレクションはshow collectionsコマンドで確認することができます。コレクションの削除はdb.collection_name.drop()で削除することができます。


> show collections
users
//コレクションの削除
> db.users.drop()
true

データベースの削除

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


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

ドキュメントの作成

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

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

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

作成したデータはfindコマンドで確認することができます。nameとageの他に_idキーが自動で追加されていることもわかります。


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

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


> 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"
}

一度に複数のドキュメントを作成したい場合はinsertManyを利用することができます。配列の中にオブジェクトを複数入れることで複数の挿入に対応します。


> db.users.insertMany([
... { name: "Jane", age: 30},
... { name: "Ken", age: 30}
... ]
... )
{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("60dbbc4bbb76605ee3051617"),
		ObjectId("60dbbc4bbb76605ee3051618")
	]
}

ドキュメントの表示

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
}

実際にアプリケーションを作成する場合はコマンドラインでドキュメントの作成、更新、削除を行う機会は少ないかもしれませんがアプリケーションから本当に作成、更新、削除が行われているか確認するときに利用する機会があるのでコマンドもしっかりと理解しておきましょう。

次はExpressサーバからの接続に関する以下の記事がおすすめです。