Blank?=False

ゆるゆる仕事したいフリーランスエンジニアの記事

MacOSXにMongoDBをインストールしてみた。

f:id:stonebeach-dakar:20161123222734p:plain
Software Design12月号のNoSQLの教科書の記事を読んで、MongoDBを試してみたくなったので MongoDBをMacOSXにインストールしました。


NoSQLについての記事はまた後日書きます。

MongoDBとは

MongoDB社が開発するオープンソースのNoSQLデータストア。
名前の由来は"ばかでかい"を意味する"huMONGOus"から。

開発はし易いが、運用はしづらい。機能は豊富だが大規模案件で使うと辛いという評判らしい。

記事のMongoDBについての説明を引用します。

内部的にはJSONを拡張したBSON(Binaly JSON)という形式でデータを保存する。
配列や階層構造等などのデータ構造に対応しており、またJSONでは扱えないバイナリ型や日付型に対応している、ドキュメント指向データベースに分類されます。


NoSQL自体が今回始めての経験なので、JSONやBSONはわかるもの、ドキュメント指向データベースというのはよくわかっていません。
こういうのもデータベーススペシャリスト試験に出るんだろうか。

MacOSXへのインストール

記事ではUbuntuのインストール方法しか書かれていませんのでちょっと調べたら、Homebrewでインストール出来るとのこと。
qiita.com ※2016年11月現在、この記事の起動方法では起動できなくなっています。

インストールが終わった後起動方法などが表示されるので要チェック

$ brew install mongodb
==> Downloading https://homebrew.bintray.com/bottles/mongodb-3.2.11.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring mongodb-3.2.11.el_capitan.bottle.tar.gz
==> Caveats
To have launchd start mongodb now and restart at login:
  brew services start mongodb
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/3.2.11: 18 files, 245.5M

起動

インストール完了後に表示されるメッセージのとおり、以下をターミナルに入力します。

$brew sercies start mongodb
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
Tapped 0 formulae (37 files, 46.7K)
==> Successfully started `mongodb` (label: homebrew.mxcl.mongodb)

設定

設定を開く場合は以下をターミナルに入力します。

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

問い合わせ

NoSQLなのでSQLじゃありません。
DB屋もSQL以外のことをやらなければいけない時代です。

MongoDBでは、JavaScriptみたいな言語を使って問い合わせを行います。
今回はこの記事のサンプルデータとなっているNasaのHPアクセスデータを使います。

まずは、MongoDBのコンソールに入るため以下のコマンドを入力します。

$mongo
MongoDB shell version: 3.2.11
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
>

後はクエリをJavascriptっぽい何かで書いていきます。

ドキュメント挿入

> db.wwwlog.save( {"host" : "192.168.0.1", "logname" : "-", "time" : 9999999999, "method": "GET", "url" : "/", "response" : 200, "bytes" : 1, "referfer" : "", "useragent" : ""} );
WriteResult({ "nInserted" : 1 })

ドキュメント検索

 db.wwwlog.find({ "host" : "192.168.0.1"});
{ "_id" : ObjectId("5835974c2672c9716ba61f5f"), "host" : "192.168.0.1", "logname" : "-", "time" : 9999999999, "method" : "GET", "url" : "/", "response" : 200, "bytes" : 1, "referfer" : "", "useragent" : "" }

ドキュメント更新

> db.wwwlog.update( { "host" : "192.168.0.1"}, { $set:{"url":"/test"} } );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.wwwlog.find( {"host" : "192.168.0.1"} );
{ "_id" : ObjectId("5835974c2672c9716ba61f5f"), "host" : "192.168.0.1", "logname" : "-", "time" : 9999999999, "method" : "GET", "url" : "/test", "response" : 200, "bytes" : 1, "referfer" : "", "useragent" : "" }

ドキュメント削除

> db.wwwlog.remove( {"host" : "192.168.0.1"});
WriteResult({ "nRemoved" : 1 })
> db.wwwlog.find( {"host" : "192.168.0.1"} );
>

ここまでざっと書いていると、ほんとにプログラミングの配列の操作のような感覚です。
心なしか、Rubyの感覚に似ているような。

JavaScriptを使用

MongoDBはJavascriptっぽい何かだけではなく、ちゃんとしたJavaScriptでもクエリが作成できます。

> for( var i = 1; i <= 10000; i++){ db.user.save({ id:1, name: "Name"+i }); }
WriteResult({ "nInserted" : 1 })
> db.user.find();
{ "_id" : ObjectId("58359a132672c9716ba61f60"), "id" : 1, "name" : "Name1" }
{ "_id" : ObjectId("58359a132672c9716ba61f61"), "id" : 1, "name" : "Name2" }
{ "_id" : ObjectId("58359a132672c9716ba61f62"), "id" : 1, "name" : "Name3" }
{ "_id" : ObjectId("58359a132672c9716ba61f63"), "id" : 1, "name" : "Name4" }
{ "_id" : ObjectId("58359a132672c9716ba61f64"), "id" : 1, "name" : "Name5" }

こういう風にSQLだと難解になりそうなクエリも簡単にかける、そう、MongoDBならね。

まとめ

NoSQLはサッパリ知らなかったのですが、さわってみるともしかしたらRDBより使いやすいかもしれない、そんな印象をもったファーストコンタクトでした。
今後もっとNoSQLに触れていきたいなーと思います。
そのためにもちゃんとNoSQLの勉強をしておいたほうが良いので、それは次回に。