初心者がmongoose公式 勉強するメモ　Schema編

# mongoose Schema
## 今回のお題はこちらです。
## http://mongoosejs.com/docs/guide.html
* 英語ですので、chromeの翻訳を使って下さい。

### インスタンスメソッドまで

* schema.js

``` js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// スキーマの作成 mongooseはここから、始まるみたいです。
const blogSchema = new Schema({
  title: String,
  author: String,
  body: String,
  components: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now},
  hidden: Boolean,
  meta: { votes: Number, favs: Number }
});

// モデルの作成
const Blog = mongoose.model('Blog', blogSchema);

// インスタンスメソッド
const animalSchema = new Schema({ name: String, type: String });

animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model( 'Animal' )
    .find({ type: this.type }, cb);
};

const Animal = mongoose.model('Animal', animalSchema);
const dog = new Animal({ type: 'dog' });

dog.findSimilarTypes((err, dogs) => {
  console.log(dogs);
});


```
* インスタンスメソッドは、組み込みメソッドが用意されているみたいですが、自分でも作れますよとのこと。
* チュートリアルで子猫が鳴いた機能ですね。
* アロー関数は、インスタンスを作成出来ないので、注意です。

### 統計
#### 静的メソッド

``` js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;


// 静的メソッド
const animalSchema = new Schema({ name: String, type: String });
animalSchema.statics.findByName = function ( name, cb ) {
  return this.find({ name: new RegExp (name, 'i' ) }, cb);
};

const Animal = mongoose.model( 'Animal' , animalSchema);
Animal.findByName( 'fido' , ( err, animals )=> {
  console .log(animals);
});
```
* インスタンスメソッドだけではなく、静的メソッドも作れますよとのこと。
* nameの個数とか、typeの個数などは、こちらを使うんでしょうか。

#### クエリーヘルパー

``` js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// クエリーヘルパー
const animalSchema = new Schema({ name: String, type: String });
animalSchema.query.byName = function ( name ) {
  return this.find({ name: new RegExp (name, 'i' ) });
};

const Animal = mongoose.model( 'Animal' , animalSchema);
Animal.find().byName( 'fido' ).exec( function ( err, animals ) {
  console .log(animals);
});
```
* インスタスメソッドの親戚みたいですが、イメージが今のところ掴めないです。

#### インデックス

``` js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// インデックス作成
const animalSchema = new Schema({
  name: String ,
  type: String ,
  tags: {
    type: [ String ],
    index: true
  } // field level
});
animalSchema.index({ name: 1 , type: -1 }); // schema level 

// 無効方法
mongoose.connect( 'mongodb://user:pass@localhost:port/database' , {
  autoIndex: false 
});

mongoose.createConnection( 'mongodb://user:pass@localhost:port/database' , {
  autoIndex: false });

animalSchema.set( 'autoIndex' , false );
new Schema({..}, { autoIndex: false }); 

// indexイベントの発行
animalSchema.index({ _id: 1 }, { sparse: true });
const Animal = mongoose.model( 'Animal' , animalSchema);
Animal.on( 'index' , function ( error ) { // "_id index cannot be sparse" console .log(error.message); }); 
```

*  インデックスキーの作成方法は、二種類あるみたいですね。
*  インデックスは作成時に負荷がかかるので、それの解除方法とindexイベントの取得方法です。

#### バーチャル

``` js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const personSchema = new Schema({ name: { first: String , last: String } });
const Person = mongoose.model( 'Person' , personSchema);
const axl = new Person({ name: { first: 'Axl' , last: 'Rose' } }); 

console.log(axl.name.first + '' + axl.name.last);

personSchema.virtual('fullName').get(function() {
  return this.name.first + '' + this.name.last;
}).set(function(v) {
    this.name.first = v.substr(0, v.indexOf(' '));
    this.name.last  = v.substr(v.indexOf(' ')+1);
  })

axl.fullName = 'William Rose';
console.log(axl.fullName);
```
* この場合新たに、fullNameを設定出来るみたいです。
* nongoDBには、fullNameとしては保存されない模様です。

### オプション

```
new Schema({..}, options);

var schema = new Schema({..});
schema.set(option, value); 
```
* 設定方法は二種類

* たくさんのoptionが設定できるみたいですが、詳細になってしまうので、割愛します。
* また必要になったら、加筆する感じで

* スキーマ編は以上です。