mongoDBの森を歩く

# 参考にしたサイト
https://dotinstall.com/
https://ja.wikipedia.org/wiki/MongoDB
https://www.mongodb.com/jp
http://junaruga.hatenablog.com/entry/2017/11/13/075029


# インストール
fedora26の場合

```
sudo dnf install mongo mongodb-server
```

# 起動と自動起動設定

```
sudo systemctl start mongod
```

```
sudo systemctl enable mongod
```


# REPL

```
mongo
```

## DBの操作

表示

```
show dbs
```

```
use mydb
```


現在のDBの情報

```
db.stats();
```


作成

```
use <db-name>
```

削除

```
db.dropDatabase();
```

## Collectionの操作

作成

```
db.createCollection("users");
```


表示

```
show collections;
```

リネーム

```
db.users.renameCollection("costumers");
```

削除

```
db.costumers.drop();
```



> use mydb
switched to db mydb
> db.users.insert(
... {
... name: "taguchi",
... score: 30
... }
... );
WriteResult({ "nInserted" : 1 })
> show collections;
users
> db.users.insert({
... name: "fkoji",
... score: 50,
... tags: ["web", "mobile"]
... });
WriteResult({ "nInserted" : 1 })
> for (var i = 0; i < 10; i++){
... db.users.insert({
... score: Math.random()
... });
... }
WriteResult({ "nInserted" : 1 })
> db.users.count();
12
> db.users.find();
{ "_id" : ObjectId("5ab85e718a6f3fc0e0564c8d"), "name" : "taguchi", "score" : 30 }
{ "_id" : ObjectId("5ab85e988a6f3fc0e0564c8e"), "name" : "fkoji", "score" : 50, "tags" : [ "web", "mobile" ] }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c8f"), "score" : 0.5051645100761789 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c90"), "score" : 0.4473334785545654 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c91"), "score" : 0.9272772678372699 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c92"), "score" : 0.17647580670114926 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c93"), "score" : 0.761121041198397 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c94"), "score" : 0.7212922554688359 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c95"), "score" : 0.03060687445135568 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c96"), "score" : 0.4207822173198339 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c97"), "score" : 0.3180118402761415 }
{ "_id" : ObjectId("5ab85eb98a6f3fc0e0564c98"), "score" : 0.9481763669280244 }
> db.users.remove({});
WriteResult({ "nRemoved" : 12 })
> db.users.find();


# find条件
```
db.users.find({team: "team-1"});
```

```
db.users.find({score: {$gte: 50}});
```

```
db.users.find({name: /t/});
```

```
db.users.find({name: /^t/});
```

```
db.users.distinct("team");
```

and文
```
db.users.find({name: /i/, score:{$gte:50}});
```

or文

```
db.users.find({$or: [{name: /i/}, {score:{$gte:50}}}});
```

in文

```
db.users.find({score:{$in: [52, 66]}});
```

exists文

```
db.users.find({age:{$exists: true}});
```

# 表示項目の指定

```
db.users.find({}, {name: true, score: 1});
```

```
db.users.find({}, {score: 0});
```

※ _idに関しては逆の真偽値を指定できる



# sort()

```
db.users.find({}, {_id:0}).sort({score: 1});
```

```
db.users.find({}, {_id: 0}).sort({score: -1});
```

# limit()

```
db.users.find({}, {_id: 0}).limit(3);
```

```
db.users.find({}, {_id: 0}).sort({score: -1}).limit(3);
```

# findOne()

```
db.users.findOne({}, {_id: 0});
```

# skip()

```
db.users.findOne({}, {_id: 0}).skip(2);
```

# 更新

更新されるのは最初の1件

項目を更新する場合は`$set`を使う

```
db.users.update({name: "taguchi"}, {$set: {score: 80}});
```

```
db.users.update({name: "taguchi"}, {$set: {score: 80, team: "team-2"}});
```

まるごと帰る場合はそのまま渡す

```
db.users.update({name: "taguchi"}, {name: "taguchi", score: 80, team: "team-2"});
```

複数更新する場合は`multi`を`true`にする

```
db.users.update({team: "team-1"}, {$set: {score: 0}}, {multi: true});
```

# $inc

加算する

```
db.users.update({name: "taguchi"}, {$inc: {score: 5}});
```

# $mul

乗算

```
db.users.update({name: "taguchi"}, {$mul: {score: 5}});
```

# $rename

フィールド名を変更

```
db.users.update({name: "taguchi"}, {$rename: {score: "point"}});
```

フィールドを追加

```
db.users.update({name: "taguchi"}, {$set: {team: "team-2"}});
```

# $unset

```
db.users.update({name: "taguchi"}, {$unset: {team: ""}});
```

# upsert

データが存在すればupdate、なければinsert

```
db.users.update({name: "taguchi"}, {name: "taguchi", score: 48}, {upsert: true});
```

# remove()

```
db.users.remove({name: "kato"});
```

# インデックス

うまく使うと検索時のパフォーマンスが向上する

インデックス情報を取得する

```
db.users.getIndexes();
```

`score`に対して降順のインデックスをつける

```
db.users.createIndex({score: -1});
```

削除

```
db.users.dropIndex("score_-1");
```

ユニークキーにする

```
db.users.createIndex({name: 1}, {unique: true});
```

# バックアップと復元

## バックアップ

```
mongodump -d mydb
```

## 復元

```
mongorestore --drop
```