8月 032012
Query投げて返ってきたDocumentsが関数を持っていて欲しい時にVirtual Attributes使う。
- スキーマ.virtual(‘名前’).get(function(){ /**/ })
- スキーマ.virtual(‘名前’).set(function(){ /**/ })
例えば、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氏が教えてくれた。