はじめてのMongoDB


## はじめに

これまで、主にMySQLを使ってきたので、ガッツとRDBに染まっています。
最近流行り(ちょっと遅いが)のNoSQLも触ってみようという事で、MongoDBを触ってみようと思います。

きっかけとしては、最近node.jsも触っていて、その時に[mongodbも触る機会があった](http://qiita.com/ritukiii/items/e6ac9077533bdcdd1a5a)ので、今回MongoDBがどんなものか、簡単な使い方をメモ程度にまとめてみました。

## インストールから接続まで

わたしはMacを使っていたので、[公式](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/)の手順に従ってインストールしました。

インストールが完了し、パスが通ったら、、

```bash
$ sudo mongod
Password:
2017-09-13T22:00:54.175+0900 I CONTROL  [initandlisten] MongoDB starting : pid=51720 port=27017 dbpath=/data/db 64-bit host=********

....
```

こんな感じでmongoがデーモンとして立ち上がります。

## ターミナルから触ってみる

mongodが立ち上がっていれば、`mongo`と打てばターミナルから接続出来ます。

```bash
$ mongo

... 色々と接続情報出る ...

> show dbs
admin  0.000GB
local  0.000GB
```

こんな感じです。

### 各種操作方法

コマンド|説明|備考
---|---|---
show dbs|データベース一覧の表示|-
use [DB名]|データベースを切り替える|存在しないDB名を入力すると、DBが作成されます(ただ、collectionがないと`show dbs`には表示されない
db.dropDatabase()|データベースの削除|今useしているデータベースを削除します(引数指定とかではないので結構怖い)
show collections|コレクション一覧の表示|collectionが、RDSで言う所のテーブルにあたります
db.createCollection('[collection名]')|コレクション作成|-
db.[collection名].drop()|コレクションの削除|-
db.[collection名].insert([オブジェクト])|コレクションにデータを挿入する|-
db.[collection名].find()|コレクションの中身を全件取得|RDBのselect
db.[collection名].update({条件}, { $set: {更新内容}})|条件で指定した内容を更新する|ただし最初の1件のみ
db.[collection名].update({条件}, { $set: {更新内容}}, {multi:true)|条件で指定した内容を更新する|この場合は全て更新する
db.[collection名].remove( {条件} )|条件にマッチするものを全て削除|削除の場合はmultiをつけなくても全て消える


## 一通り触って試してみる

```sql
-- まずはデータベース一覧を表示してみます
> show dbs;
admin  0.000GB
local  0.000GB

-- これでtest_dbが作られます
> use test_db
switched to db test_db

-- まだcollectionが存在しないので、データベース一覧には出ません
> show dbs
admin  0.000GB
local  0.000GB

-- collectionsを作ってみます
> db.createCollection('language')
{ "ok" : 1 }
> show collections
language

-- collectionが存在するとデータベース一覧に表示されます
> show dbs
admin    0.000GB
local    0.000GB
test_db  0.000GB

-- collectionにいくつかデータを入れてみます
> db.test_db.insert({name: 'yamada',  lang: 'ja'});
WriteResult({ "nInserted" : 1 })
> db.test_db.insert({name: 'okamoto', lang: 'ja'});
WriteResult({ "nInserted" : 1 })
> db.test_db.insert({name: 'saito',   lang: 'ja'});
WriteResult({ "nInserted" : 1 })
> db.test_db.insert({name: 'saito',   lang: 'en'});
WriteResult({ "nInserted" : 1 })
> db.test_db.insert({name: 'yamada',  lang: 'ru'});
WriteResult({ "nInserted" : 1 })

-- collectionからデータを取得します
> db.test_db.find()
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3d"), "name" : "yamada", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3e"), "name" : "okamoto", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3f"), "name" : "saito", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d40"), "name" : "saito", "lang" : "en" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d41"), "name" : "yamada", "lang" : "ru" }

-- yamada君のlangをchに更新してみます
-- findするとわかりますが、最初のyamada君しかchに更新されていません
> db.test_db.update({name: 'yamada'}, { $set: {lang: 'ch'}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test_db.find()
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3d"), "name" : "yamada", "lang" : "ch" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3e"), "name" : "okamoto", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3f"), "name" : "saito", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d40"), "name" : "saito", "lang" : "en" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d41"), "name" : "yamada", "lang" : "ru" }


-- yamada君のlangを全てchに更新してみます(multiを使います)
-- 最初と最後の両方が更新されました
> db.test_db.update({name: 'yamada'}, { $set: {lang: 'ch'}}, {multi: true});
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })
> db.test_db.find()
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3d"), "name" : "yamada", "lang" : "ch" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3e"), "name" : "okamoto", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3f"), "name" : "saito", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d40"), "name" : "saito", "lang" : "en" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d41"), "name" : "yamada", "lang" : "ch" }

-- collectionからsaitoさんのデータを消してみます。
-- この場合はmultiを指定せずとも全て消えました
> db.test_db.remove( {name: 'saito'} )
WriteResult({ "nRemoved" : 2 })
> db.test_db.find()
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3d"), "name" : "yamada", "lang" : "ch" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d3e"), "name" : "okamoto", "lang" : "ja" }
{ "_id" : ObjectId("59b9307c28b8ae102fb50d41"), "name" : "yamada", "lang" : "ch" }

-- 最後にデータデータを消してみます
> db.dropDatabase()
{ "dropped" : "test_db", "ok" : 1 }
> show dbs
admin  0.000GB
local  0.000GB
```

ざっくりと触りだけですが、次回はこの基礎知識を活かしてよりnode.jsからmongoをゴリゴリ触っていきます。