macOS CatalinaにMongoDBをインストール

概要

MacにMongodbをインストールする。

手順

以下のコメントではだめだった

$ brew install mongodb
~~(省略))
Error: No available formula or cask with the name "mongodb".
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.

mongodb-communityをインストール

この資料を参考にした

$ brew tap mongodb/brew
Updating Homebrew...
==> Tapping mongodb/brew
Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'...
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 462 (delta 38), reused 42 (delta 17), pack-reused 365
Receiving objects: 100% (462/462), 101.47 KiB | 298.00 KiB/s, done.
Resolving deltas: 100% (207/207), done.
Tapped 11 formulae (39 files, 171.5KB).
$
$ brew install mongodb-community
Updating Homebrew...
==> Installing mongodb-community from mongodb/brew
==> Downloading https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-x86_64-100.2.0.zip
######################################################################## 100.0%
==> Downloading https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.4.1.tgz
######################################################################## 100.0%
==> Installing dependencies for mongodb/brew/mongodb-community: mongodb-database-tools
==> Installing mongodb/brew/mongodb-community dependency: mongodb-database-tools
🍺  /usr/local/Cellar/mongodb-database-tools/100.2.0: 13 files, 172.9MB, built in 4 seconds
==> Installing mongodb/brew/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.4.1: 11 files, 136.8MB, built in 3 seconds
==> Caveats
==> mongodb-community
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

以下のファイルが作成されるということだ。

設定ファイル(/usr/local/etc/mongod.conf)
ログディレクトリパス(/usr/local/var/log/mongodb)
データディレクトリパス(/usr/local/var/mongodb)

$ ls -ld /usr/local/etc/mongod.conf /usr/local/var/log/mongodb /usr/local/var/mongodb
-rw-r--r--  1 liu  admin  161 10 25 11:52 /usr/local/etc/mongod.conf
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/log/mongodb
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/mongodb

設定ファイルの内容

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.1
Build Info: {
    "version": "4.4.1",
    "gitVersion": "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1",
    "modules": [],
    "allocator": "system",
    "environment": {
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

2020/10月時点で最新の 4.4.1 である。

起動と停止

mongdbのバックグランドプロセスを自動起動させたい場合は

$ brew services start mongodb-community

自動起動を停止する場合は

$ brew services stop mongodb-community

手動で起動したい場合は、設定ファイルを指定して起動を行う(以下はバックグランドで起動させる場合)

$ mongod --config /usr/local/etc/mongod.conf &
[1] 5301

手動起動したmongodbを停止する場合は、Ctrl + C で止めるか、バックグランド起動した場合は、$ fgでフォアグランドにしてからCtrl + Cで止めればいい。

mongodbへ接続

mondodbを起動させた状態で接続するには

$ mongo

起動していない状態で接続すると、以下のようなエラーが表示される 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 :

DB操作

DB確認

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

mongodbでのテーブルと行の概念

RDB mongodb
テーブル コレクション
ドキュメント

DB作成

> use test_db
switched to db test_db

test_db が存在するならそのdbに接続し、存在しなければ新しく作成する。

接続中のdbを表示するには

> db
test_db

dbを作成しただけでは、show dbsコマンドでは追加されない

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

追加するには、コレクションを作成する必要がある(下の例では vuln というコレクションを作成した)

db.createCollection('vuln')
{ "ok" : 1 }
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB

ドキュメントの作成

mongodbでは、列名やデータ型などを先にきめてから行を追加することはない。
1件のドキュメントを作成するには inserOne コマンドを使う。

> db.vuln({ name: "Apache Struts 2の脆弱性", level: "S0", limit_date: "2020-12-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f954c22051b138e6af85465")
}

insertOneでドキュメントを作成する時、もし vuln コレクションが存在しない場合、その時に一緒に作成してくれる(便利!)。

作成したドキュメントを確認するには

> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }

もう1つを作成する

> db.vuln.insertOne({ name: "ATS DDoS脆弱性", level: "S1", limit_date: "2021-01-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f95571d051b138e6af85467")
}
> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }
{ "_id" : ObjectId("5f95571d051b138e6af85467"), "name" : "ATS DDoS脆弱性", "level" : "S1", "limit_date" : "2021-01-31" }

find()で確認する内容をきれいにしたい場合は、pretty() を使う。

> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

まさにjson形式。

ドキュメントを探す

2つの方法があり、1つはObjectIdを使うこと、もう1つはキーとその値を使って探すことができる。

> db.vuln.find(ObjectId("5f954d22051b138e6af85466")).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
> db.vuln.find({"name": "Apache Struts 2の脆弱性"}).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}

ドキュメントの更新

Apache Strusts 2の脆弱性のレベルをS1に更新したい、

> db.vuln.update({"name": "Apache Struts 2の脆弱性"}, {$set: {"level": "S1"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S1",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

#### ドキュメントの削除
1件削除するにはdeleteOneを使う。

db.vuln.deleteOne({"name" : "ATS DDoS脆弱性"}) { "acknowledged" : true, "deletedCount" : 1 }

db.vuln.find().pretty() { "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S1", "limit_date" : "2020-12-31" }

#### コレクション一覧

show collections vuln

#### コレクションの削除
drop()コマンドを使う。

db.vuln.drop() true

コレクションがなくなると、先に作成したtest_dbが表示されなくなった。

show dbs admin 0.000GB config 0.000GB local 0.000GB

#### DBの削除

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

### まとめ
mongodbをMacにインストールし、一番初歩的な操作方法を体験した。使った感想としては、DBのスキーマに気にする必要がなく、json形式なドキュメントであれば、簡単に追加することができた。しかし、手打ちでDB操作コマンドを打つには、ちょっと慣れが必要と感じた。

大量な構造化されたjsonデータを追加し、表示させるような単純な動作(Webスクレイピング等)であれば、mongodbは手軽に利用できていいのではないかと思った。

### 参考資料
- [https://reffect.co.jp/windows/mac-mongodb-install:title]
- [https://qastack.jp/programming/58283257/mongodb-cant-find-data-directory-after-upgrading-to-mac-os-10-15-catalina:title]