駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

Mongooseのvirtual

virtual・・・

データベースには保存していない仮想的なプロパティをスキーマに追加できる機能。

MongoDBに永続化(保存)されませんが、ドキュメント取得時には付与されるものになり

ます。

 

早速サンプルを見ていきます。

//スキーマ定義
const personSchema = new mongoose.Schems({
first: String,
last: String
});

このように苗字や名前のプロパティが存在し、データベースに保存されています。

苗字と名前がセットになったフルネームのプロパティも使うことが多くなると考えられ

ます。そこでフルネームまで保存していたらキリがないですよね。

そんな時に使えるのが今回の「virtual」になります。

const personSchema = new mongoose.Schems({
first: String,
last: String
});

// スキーマを定義した後にvirtual関数を使い、仮想プロパティfullNameを定義
personSchema.virtual('fullName').get(function () {
return `${this.first} ${this.last}`;
})
//モデル作成
const Person = mongoose.model('Person', personSchema);

personのインスタンスから「fullName」が呼ばれたとき、「first」 と「last」を連結さ

せた値を返すようにできます。

そして、mongooseは「fullNameプロパティ」にアクセスする度に、getter関数を呼び出

します。(ゲットする意味)

// ドキュメント(Personインスタンス)を生成する
const person1 = new Person({
name: { first: 'Taro', last: 'Yamada' }
});
 
console.log(person1.fullName);
// Taro Yamada

また、setter関数というのもあります。

getの逆であり、データベースに存在しないプロパティに対して、あたかも存在するかの

ようにモデルのインスタンスにセットすることができる機能です。

 

virtualのsetterに関しても記載があります。確認してみてください。

mongoosejs.com