Query投げて返ってきたDocumentsが関数を持っていて欲しい時にVirtual Attributes使う。

  • スキーマ.virtual(‘名前’).get(function(){ /**/ })
  • スキーマ.virtual(‘名前’).set(function(){ /**/ })
でgetter/setterを付けれる。

例えば、MongoDBにはidしか保存しないようにして、permalinkのURL等はidから組み立てる場合、そういう関数はmodelに持たせたい。


実装例

RecipeSchema.virtual(‘url’).get に関数を登録しておくと、 doc.url で呼び出せる。

mongoose_virtual_attr.js
var _ = require('underscore');
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test', function(err){
if(err){
console.error(err);
process.exit(1);
}
});

var Schema = mongoose.Schema, ObjectId = Schema.ObjectId;

var RecipeSchema = new Schema({
id : {type: String, unique: true},
title : {type: String},
created_at : {type: Date, default: Date.now}
});
RecipeSchema.virtual('url').get(function(){
return 'http://shokai.org/'+this.id;
});

var Recipe = mongoose.model('Recipe', RecipeSchema);
Recipe.latests = function(num){
return this.find().sort('created_at', -1).limit(num);
};

var recipe = new Recipe({id: '29jg', title: '肉じゃが'});
recipe.save();

Recipe.latests(3).exec(function(err, docs){
if(err){
throw err;
}
else{
_.each(docs, function(doc){
console.log(doc.url);
});
}
mongoose.disconnect();
});


% npm install mongoose underscore
% node mongoose_virtual_attr.js
http://shokai.org/29jg


というのがやり方わかんないんだよねぇ・・と相談したらmyatsumoto氏が教えてくれた。