Old Sunset Days

MacにNoSQLのMongoDBを入れて使ってみる

日付 タグ mongodb カテゴリ others

目次

MongoDBのインストール

普段RDBのMySQLを業務で良く使っているが、NoSQLに関しては触ったことあるのはRedisだけ。 Node.jsを勉強していて、DBとしてMongoDBを使うと結構便利そうだというのがわかったので、 NoSQLとして最近需要が高まっているMongoDBをMacにインストールして使ってみる。

https://www.mongodb.com/ - MongoDB

NoSQLとはNot Only SQLという意味だそうだ。それだけにSQL命令文などは利用ができない。 また、トランザクションの一貫性を勝手に保証してくれるRDBとは違ってそういったサポートがない。 しかし、その分、データへのアクセスが軽い。

NoSQLには主に以下のようなものがある。

  • キーバリュー型
    • 基本的にはKey, Valueの単純なペアで記録されるもの
    • Redisはこのタイプになる
  • ドキュメント指向型
    • XMLやJSONといったスキーマレスでデータ構造が受難なもの
    • 今回インストールするMongoDBはこのタイプ
  • ソート済みカラム指向型
    • キーバリューの拡張で複数のバリューを持つもの
    • Apache HBaseなどがこのタイプ

最近のWEBサービス等ではJSONで結果を返したりすることが多いので、JSONをそのまま保存して突っ込めるMongoDBが利用される場面が増えているようだ。

HomebrewでMongoDBのインストール

まずはTapのインストール

$ brew tap mongodb/brew

そして、brewでMongoDBのインストール

$ brew install mongodb-community

正しくインストールできたか、バージョンをとりあえず確認してみる。

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

デフォルトでログやデータがどこに保存されるかの確認をすると、

$ cat /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

以上の場所に保存されることがわかる。

インストールされたMongoDBを使ってみる

MongoDBサービスを起動させておく

$ brew services start mongodb-community

その上で、MongoDBに接続。

$ mongo

とりあえずhelpコマンドでどんなコマンドあるかちょっとチェック

> help
	db.help()                    help on db methods
	db.mycoll.help()             help on collection methods
	sh.help()                    sharding helpers
	rs.help()                    replica set helpers
	help admin                   administrative help
	help connect                 connecting to a db help
	help keys                    key shortcuts
	help misc                    misc things to know
	help mr                      mapreduce

	show dbs                     show database names
	show collections             show collections in current database
	show users                   show users in current database
	show profile                 show most recent system.profile entries with time >= 1ms
	show logs                    show the accessible logger names
	show log [name]              prints out the last segment of log in memory, 'global' is default
	use <db_name>                set current database
	db.mycoll.find()             list objects in collection mycoll
	db.mycoll.find( { a : 1 } )  list objects in mycoll where a == 1
	it                           result of the last line evaluated; use to further iterate
	DBQuery.shellBatchSize = x   set default number of items to display on shell
	exit                         quit the mongo shell

MongoDBにもMySQLのようにデータベースをチェックするコマンドがあるので見てみる

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

これらはデフォルトで用意されているデータベース。 ではデータベースを作成して追加してみる。

> use test
switched to db test

実際に追加されるには、コレクション(MySQLだとテーブルにあたる)を生成する必要があるので、コレクションとして「notes」を追加

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

今しがたまでやった操作でどうなったか状態を確認

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> db
test
> show collections
notes

データベースとして「test」が追加され、現在選択のデータベース「test」にはコレクションとして「notes」が追加されていることが確認できた。

では実際のデータを追加してみよう。

> db.notes.insertOne({ title: "Today", message: "Hello Today"})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5fb6676c6099244c572e405f")
}

ここで本当に追加できたかコレクションを確認してみよう。

> db.notes.find()
{ "_id" : ObjectId("5fb6676c6099244c572e405f"), "title" : "Today", "message" : "Hello Today" }

問題なくデータが追加されている。

さらにデータをもう1つ追加してコレクションを見てみる。

> db.notes.insertOne({ title: "Tomorrow", message: "Hello Tomorrow"})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5fb667736099244c572e4060")
}
> db.notes.find()
{ "_id" : ObjectId("5fb6676c6099244c572e405f"), "title" : "Today", "message" : "Hello Today" }
{ "_id" : ObjectId("5fb667736099244c572e4060"), "title" : "Tomorrow", "message" : "Hello Tomorrow" }

無事データが追加できた。

1つ目のデータをキーを指定してデータを削除してみる。

> db.notes.deleteOne({ title : "Today" })
{ "acknowledged" : true, "deletedCount" : 1 }
> db.notes.find()
{ "_id" : ObjectId("5fb667736099244c572e4060"), "title" : "Tomorrow", "message" : "Hello Tomorrow" }

1つ目に入っていたデータが消えていることが確認できた。

データの更新はどうやるのか。

> > db.notes.update({ title : "Tomorrow" },{$set: { title : "Yesterday", message :"Hello Yesterday" }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.notes.find()
{ "_id" : ObjectId("5fb667736099244c572e4060"), "title" : "Yesterday", "message" : "Hello Yesterday" }

データの更新がされた。

データベースにもう1つコレクション「users」を追加した後、最初に作ったコレクション「notes」を削除してみる。

> db.createCollection("users")
{ "ok" : 1 }
> show collections
notes
users
> db.notes.drop()
true
> show collections
users

「users」を追加した後に「notes」を削除したので、残ったのは「users」のみ。

さらにテストで使ったデータベース「test」を削除してみる。

> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

問題なく消えたので、exitで終了しよう。

> exit
bye

あとは立ち上げておいたMongoDBのサービスを停止。

$ brew services stop mongodb-community

以上、一連の操作でMongoDBの簡単な使い方を見てきた。

Node.jsを勉強中で、いろいろサンプルアプリ作りながら学んでいるので、Node.jsとの絡みでMongoDBも積極的に今後は利用していってみたいと思っている。