11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-05

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が設定できるみたいですが、詳細になってしまうので、割愛します。

  • また必要になったら、加筆する感じで

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

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?