MongoDB コマンドメモとか書き

メモ書き。
間違いがあったらごめんなさい。

# MongoDBの構造

```
- DB
 - Collection
   - Document
   - Document
   - Document
   - Document
   - Document
   - Document
```

Collectionがtableみたいなもので、Documentがレコードみたいなもの。
順序的にはDBを作って、Collectionを作って、Documentをinsertするようなイメージ。




# DB操作

## DB作成

```
$ mongo dbname
use dbname
```

* コレクションが無いとDB一覧には出ない
* use dbnameで使うDB切り替え
* mongo だけで起動するとtestで起動される


## DB削除

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

## DB一覧

```
show dbs
```



# コレクション操作

## コレクション一覧

```
show collections
```

## コレクション作成

COL というCollectionを作成

```
db.createCollection('COL');
```

## コレクションの削除

COL というCollectionを削除

```
db.COL.drop();
```



# ドキュメント操作

## コレクションにドキュメントを追加

```
db.COL.insert( { name:'mogeta', mogemoge:'mogegeee' } );
```

## コレクションのドキュメントの更新

### 基本的な更新

MongoDBは、multiフラグを指定しなければ最初にマッチしたドキュメントだけしか更新されない。
以下はname が 'mogeta'のドキュメントの プロパティに対して操作を行うとき。

#### 'money' のプロパティを更新

```
db.COL.update( { name:'mogeta' }, { $set:{ money: 9999999 } } );
```

#### 'money' のプロパティを削除

```
db.COL.update( { name:'mogeta' }, { $unset:{ money: "" } } );
```

#### 'money' のプロパティに10を加算

```
db.COL.update( { name:'mogeta' }, { $inc:{ money: 10 } } );
```

#### 'money' のプロパティに10を減算

```
db.COL.update( { name:'mogeta' }, { $inc:{ money: -10 } } );
```

#### 'money' のプロパティ名を 'mymoney' に変更

```
db.COL.update( { name:'mogeta' }, { $rename:{ money: "mymoney" } } );
```

##### 注意

下記のやり方だとドキュメントが{ money: 9999999 }になってしまう！

```
db.COL.update( { name:'mogeta' }, { money: 9999999 } );
```


###  複数のドキュメントを一律更新する場合

MongoDBは、multiフラグを指定しなければ最初にマッチしたやつだけしか更新されない。

```
db.COL.update( { name: 'mogeta' }, { $set:{ money: 1000000 } }, { multi:true } );
```


### コレクション内のドキュメントがあれば更新、なければ追加

upsert的な

#### update

```
db.COL.update( { name:'mogeta' }, { name:'mogeta', mogemoge:'mogegeee' }, { upsert:true } );
```

#### save

_idがあれば可能。

```
db.COL.save( { _id: ObjectId("51b9bbad15349740afd96f99"), name:'mogeta2' } );
```

* _idがなければずっと新しいドキュメントが追加される。何時使うのかな・・・。


### コレクション内のドキュメント全件削除

```
db.COL.remove({});
```

* バージョンが上がると{}が必要となった

#### 特定の値を持っているものだけ削除

```
db.COL.remove( { name: 'mogeta' } );
```

* こちらはupdateと違ってmultiフラグを指定しなくても、該当するドキュメントが全部削除される



### コレクション内のドキュメント取得

select的な

#### 全件取得

```
db.COL.find();
db.COL.find( {} );
```

#### コレクションの特定のドキュメントを取得

```
db.COL.find( { name:'mogeta' } );
```

#### 正規表現を使って取得

```
db.COL.find( { name:/mogeta/ } );
```

* 私は正規表現を使う機会はないので余り試していない・・。


#### その他の条件指定

##### money > 30

```
db.COL.find( { money: { $gt: 30 } } );
```

##### money >= 30

```
db.COL.find( { money: { $gte: 30 } } );
```

##### money < 30

```
db.COL.find( { money: { $lt: 30 } } );
```

##### money <= 30

```
db.COL.find( { money: { $lte: 30 } } );
```

##### money == 'mogeta'

```
db.COL.find( { money: { $eq: 'mogeta' } } );
```

##### money != 'mogeta'

```
db.COL.find( { money: { $ne: 'mogeta' } } );
```

##### name（配列） から 'mogeta' or 'mogeta3' のものを抽出

```
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } } ) );
```

##### name（配列） から 'mogeta' or 'mogeta3' が入っていないものを抽出

```
db.COL.find( { name: { $nin: ['mogeta','mogeta3'] } } ) );
```

#### 複数条件

### And

2通りある

以下は name が 'mogeta' で、money が 1000000 以上のものを取得

#### find にそのまま複数指定

```
db.COL.find({
  name  : 'mogeta',
  money : { $gt : 1000000  }
});
```

#### And(演算子）

記述は長いけどコチラのほうが色々できそう（なきがしているだけ）

```
db.COL.find({
  $and: [
    { name  : 'mogeta' },
    { money : { $gt : 1000000  } }
  ]
});
```

### OR

以下は name が 'mogeta'か'mogeta3' で、money が 1000000 以上のものを取得

#### or(演算子）

```
db.COL.find({
  $or: [
    { name: { $in: ['mogeta','mogeta3'] } },
    { money : { $gt : 1000000  } }
  ]
});
```


#### 取得するプロパティを指定

なにも指定しなければ、ドキュメントの値が全て取得できてしまう。
'\_id'とか不要なことも多いと思うので、不要なデータを受け取らずにするにはこの項目の方法を参照

```
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1 } );
```

* 1と0で表示非表示。ただし、1と0を混在させることはできない。;

NG パターン;

```
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1,money:0 } );
```

OK パターン;

```
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1, _id:0 } );
```
* IDだけは例外で許容される仕様らしい


#### 取得する件数の指定

limitのほうが応用が効きそう

##### ドキュメントを最初の一件だけ取得する場合

fineOneを使う

```
db.COL.findOne( { name: { $in: ['mogeta','mogeta3'] } }, { name:1, _id:0 } );
```

##### ドキュメントを3件だけ取得する場合

limitを使う

```
db.COL.find( { name: 'mogeta' } ).limit(3);
```

##### 結果を整形して表示する

pretty()を使う

```
db.COL.findOne( { name: 'mogeta' } ).pretty();
```

##### 指定したドキュメントからlimitで指定された分のドキュメントを取得

2件飛ばした位置から3件取得

```
db.COL.find( { name: 'mogeta' } ).skip(2).limit(3);
```

### ソートの指定

昇順: 1
降順: -1

```
db.COL.find().sort( { money:-1 } );
```


## ドキュメントの件数を取得

```
db.COL.count();
```

## 重複レコードの除去（distinct）

nameのプロパティで重複しているもの以外の値を重複データを除いて取得

```
db.COL.distinct( 'name' );
```


## インデックス

昇順: 1
降順: -1

### 一覧

```
db.COL.getIndexes();
```

### 追加

```
db.COL.ensureIndex( { name : 1 } );
```

### 削除

```
db.COL.dropIndex( { name : 1 } );
```