MacOSXにMongoDBをインストールしてみた。
Software Design12月号のNoSQLの教科書の記事を読んで、MongoDBを試してみたくなったので
MongoDBをMacOSXにインストールしました。
- 出版社/メーカー: 技術評論社
- 発売日: 2016/11/18
- メディア: 雑誌
- この商品を含むブログを見る
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の勉強をしておいたほうが良いので、それは次回に。