mongodb を docker でインストールして、コレクション作って find するところまで

仕事で mongodb を触る機会があり、知識がなかったのでやったことベースでざっとメモる。

# mongodb インストール

参考にさせていいただきました🙏
https://qiita.com/fetaro/items/34e29a21b5f0da6449ef

## docker image

mongo の docker image は下記より。
https://hub.docker.com/_/mongo

tag名についている、xenial とか bionic とかは ubuntu の version 毎に割り当てられた開発コード（初めて知ったと見せかけて調べたの二回目😩）。  

それぞれサポート期間が異なるので注意。 https://kledgeb.blogspot.com/2013/08/ubuntu.html

今回は、 新しめの `4.1.10-bionic` を使う。


## docker image 取得とコンテナ起動

```
$ docker run --name local-mongo -d mongo:4.1.10-bionic
$ docker start -name local-mongo
```

# mongo shell 立ち上げ

```
$ docker run -it --link local-mongo:mongo --rm mongo:4.1.10-bionic sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/"'
```

# データベースの作成

データベースが存在しなかった場合は最初にコレクションのレコードを作成した時に自動で作成されるので予め選択しておく。  

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

> use myDB
```

# コレクション・レコードの作成

コレクションも同様にレコードを作成した時に自動で作成される。

```
> db.myCollection.insertOne ( { x: 1 } )
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5cd3f6afdac2a69138ce3ba5")
}

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

データベースが作成されていることも確認できる。
また、コレクションを明示的に作成するときは [createCollection](https://docs.mongodb.com/manual/reference/method/db.createCollection/#db.createCollection) メソッドを使う。  

スキーマレスなので、レコード間でスキーマ定義が異なっていても良い。

```
> db.myCollection.insertOne({
	user_id : 123,
	"detail" : {
		name: "t_horikoshi",
		age: 29,
	}
})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5cd3f9a9dac2a69138ce3ba6")
}
```

# コレクションのデータ取得

`find` メソッドを使う。

```
> db.myCollection.find()
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5"), "x" : 1 }
{ "_id" : ObjectId("5cd3f9a9dac2a69138ce3ba6"), "user_id" : 123, "detail" : { "name" : "t_horikoshi", "age" : 29 } }
```

`pretty` メソッドを実行するとJSON整形してくれる。

```
> db.myCollection.find().pretty()
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5"), "x" : 1 }
{
	"_id" : ObjectId("5cd3f9a9dac2a69138ce3ba6"),
	"user_id" : 123,
	"detail" : {
		"name" : "t_horikoshi",
		"age" : 29
	}
}
```

## 検索条件を指定してい取得

`find` メソッドの第一引数に条件を指定する。

```
> db.myCollection.find ( { x: 1 } )
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5"), "x" : 1 }
```

ネストしたパラメータの条件指定は下記のような感じ。

```
> db.myCollection.find ( { "detail.name": "t_horikoshi" } )
{ "_id" : ObjectId("5cd3f9a9dac2a69138ce3ba6"), "user_id" : 123, "detail" : { "name" : "t_horikoshi", "age" : 29 } }
```

## 取得するパラメータを指定する

`find` メソッドの第二引数に条件を指定する。
指定したパラメータを持たないレコードは該当するパラメータを持たない状態で結果が返る。

```
> db.myCollection.find ( {}, { x: 1 } )
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5"), "x" : 1 }
{ "_id" : ObjectId("5cd3f9a9dac2a69138ce3ba6") }

> db.myCollection.find ( {}, { "detail.name": 1 } )
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5") }
{ "_id" : ObjectId("5cd3f9a9dac2a69138ce3ba6"), "detail" : { "name" : "t_horikoshi" } }
```

`_id` を取得したくなければ、 `"_id": 0"` を指定する。

```
> db.myCollection.find ( {}, { "detail.name": 1, "_id": 0 } )
{  }
{ "detail" : { "name" : "t_horikoshi" } }
```

## 取得する件数を制限したい

`limit` メソッドを使う。

```
> db.myCollection.find ().limit(1)
{ "_id" : ObjectId("5cd3f6afdac2a69138ce3ba5"), "x" : 1 }
```

とりあえず1件だけ欲しい場合は、 `findOne` というのもある(割愛)。

## 件数が知りたい

`count` メソッドを使う。

```
> db.myCollection.find ().count()
2
```

# その他の参考ページ

- https://docs.mongodb.com/manual/core/databases-and-collections/
- https://docs.mongodb.com/manual/core/views/
- https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find

# おしまい