mongoose Schema
今回のお題はこちらです。
http://mongoosejs.com/docs/guide.html
- 英語ですので、chromeの翻訳を使って下さい。
インスタンスメソッドまで
- schema.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);
});
- インスタンスメソッドは、組み込みメソッドが用意されているみたいですが、自分でも作れますよとのこと。
- チュートリアルで子猫が鳴いた機能ですね。
- アロー関数は、インスタンスを作成出来ないので、注意です。
統計
静的メソッド
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の個数などは、こちらを使うんでしょうか。
クエリーヘルパー
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);
});
- インスタスメソッドの親戚みたいですが、イメージが今のところ掴めないです。
インデックス
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イベントの取得方法です。
バーチャル
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が設定できるみたいですが、詳細になってしまうので、割愛します。
-
また必要になったら、加筆する感じで
-
スキーマ編は以上です。