初心者がmongoose公式チュートリアルを勉強するメモ

# mongoose クイックスタート
## 今回のお題はこちらです。
## https://mongoosejs.com/docs/index.html

* 対象は、dotinstallさんで、mongoDBを学んだ方が主な対象です。
* mongooseは、node.js上でmongoDBを扱うためのライブラリーです。
* 本家のチュートリアルを学ぶのが一番情報的に正確と思いますのでこちらを使って行きたいと思います。
* 本家は英語ですが、google先生の翻訳で十分わかります。
* mongoDB の説明はしません。
* mongoDBをmongo shellで使えるようになった後実際使う場合に、javascriptで扱えれば応用できそうです。
* node.js環境で扱うには、mongoDB公式とmongooseのドライバーを使うことになるみたいです。
* 今回は、一般的にmongooseドライバーを使う人が多いとのことで、mongooseドライバーを使って行きたいと思います。
* node.jsは、すでに入っている前提です。
	* node --version
	* v12.10.0
	* versionは多少違っていても、練習ではあまり影響は無いと思います.
* mongoDBも既に、入っている前提です。
  * mongo --version
  * MongoDB shell version v4.2.0
* dotinstallさんで、学んでいる方は、Vagrant環境がありますので、そちらでしてもいいんじゃないかと思います。
* 私は、Dockerコンテナで試していますが、 mongoDB, node.js が動いていれば大丈夫です。
* 環境は、Macですがnode.jsを導入した後は同じだと思いますので、適宜読み替えて下さい。
* 結果表示は掲載しませんので、実際試してみて下さい。

---
### git関係 必要ないなら無視
* いつでも、おかしくなったら戻れるように入れて置くことをおすすめします。
* うまく行ったところで、適宜commitして下さい。
* 練習ディレクトリを適当な名前で作成してください。
* touch .gitignore
* vim .gitignore
  - vimでなくても構いませんが、慣れる為に使います。

* .gitignore

``` js
node_modules
```

* git init
* git add .
* git commit -m "first commit"

---
### チュートリアルを始めます。
* チュートリアルですが、細かい説明は無いです。
* まず、使うための雰囲気を覚えろみたいな内容です。

* npm init -y
* npm install -D mongoose


### 子猫silenceの作成まで

* getting-started.js

``` js
const mongoose = require('mongoose');
// 一般的には, `mongodb://localhost/test` の指定になります
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true});
// mongoose.connect('mongodb://mongo/test', {useNewUrlParser: true});
const db = mongoose.connection;

db.on('error', console.error.bind(console, 'mongo 接続エラー ctrl + c:'));
db.once('open', () =>  {
  console.log('DB接続中... You can cancel from ctrl + c')
});

const kittySchema = mongoose.Schema({
  name: String
});

const Kitten = mongoose.model('Kitten', kittySchema);

const silence = new Kitten({ name: 'Silence' });
console.log('子猫の名前: ', silence.name);

// mongoose.disconnect();
```


* node getting-started.js

* DBに正常に繋がっていれば、DB接続中及び子猫の名前が表示されます。
* まだ、DBには接続確認のみで、アクセスはしていません。

### 子猫が鳴くところまで

* getting-started.js

``` js
const mongoose = require('mongoose');
// 一般的には, `mongodb://localhost/test` の指定になります
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true});
// mongoose.connect('mongodb://mongo/test', {useNewUrlParser: true});
const db = mongoose.connection;

db.on('error', console.error.bind(console, 'mongo 接続エラー ctrl + c:'));
db.once('open', () =>  {
  console.log('DB接続中... You can cancel from ctrl + c')
});

const kittySchema = mongoose.Schema({
  name: String
});

// const Kitten = mongoose.model('Kitten', kittySchema);
// const silence = new Kitten({ name: 'Silence' });
// console.log('子猫の名前: ', silence.name);


kittySchema.methods.speak = function () { // メソッド作成
  const noName = "名前はまだ無い"
  const greeting = this.name ? "みゃ〜の名前は " + this.name : noName ;
  console.log(greeting);
}

kittySchema.methods.speak(); // 無登録でメソッド実行

const Kitten = mongoose.model('Kitten', kittySchema); // モデル作成
const tama = new Kitten({ name: 'Tama' }); // 名前登録 インスタンス作成
tama.speak(); // メソッド実行

// mongoose.disconnect();
```

### DBへの保存 一覧表示

``` js
const mongoose = require('mongoose');
// 一般的には, `mongodb://localhost/test` の指定になります
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true});
// mongoose.connect('mongodb://mongo/test', {useNewUrlParser: true});
const db = mongoose.connection;

db.on('error', console.error.bind(console, 'mongo 接続エラー ctrl + c:'));
db.once('open', () =>  {
  console.log('DB接続中... You can cancel from ctrl + c')
});

const kittySchema = mongoose.Schema({
  name: String
});

// const Kitten = mongoose.model('Kitten', kittySchema);

// const silence = new Kitten({
//   name: 'Silence'
// });
//
// console.log(silence.name);

kittySchema.methods.speak = function () {
  const noName = "名前はまだ無い"
  const greeting = this.name ? "みゃ〜の名前は " + this.name : noName ;
  console.log(greeting);
}

kittySchema.methods.speak();

const Kitten = mongoose.model('Kitten', kittySchema);

const tama = new Kitten({ name: 'Tama' });
tama.speak();


// 確実にsave してから　find したいので 関数にしている
async function tamaFunc() {
  await tama.save((err, kitten) => {
    if (err) console.error(err);
    console.log(kitten);
  });

  await Kitten.find((err, kittens) => {
    if (err) console.error(err);
    console.log(kittens);
  });
}
tamaFunc();

// mongoose.disconnect();
```
* 以上でチュートリアルは終了です。
* 覚えた事を少しづつ使えるようになっていきたいですね。