将“虚拟”variables添加到mongoose模式?

我有以下文件架构:

var pageSchema = new Schema({ name: String , desc: String , url: String }) 

现在,在我的应用程序,我想也有对象内的页面的HTML源,但我不想将其存储在数据库。

我应该创build一个“本地”增强对象,它有一个对数据库文件的引用?

 function Page (docModel, html) { this._docModel = docModel this._html = html } 

有没有办法通过添加一个“虚拟”字段直接使用文档模型?

       

网上收集的解决方案 "将“虚拟”variables添加到mongoose模式?"

mongoose是完全可能的。
从他们的文档中检查这个例子:

 var personSchema = new Schema({ name: { first: String, last: String } }); personSchema.virtual('name.full').get(function () { return this.name.first + ' ' + this.name.last; }); console.log('%s is insane', bad.name.full); // Walter White is insane 

在上面的例子中,该属性不会有setter。 要为这个虚拟设置一个setter,请执行以下操作:

 personSchema.virtual('name.full').get(function () { return this.name.full; }).set(function(name) { var split = name.split(' '); this.name.first = split[0]; this.name.last = split[1]; }); 

文档

我没有真正testing过,但这个想法似乎值得:

 //model var pageSchema = new Schema({ name: String , desc: String , url: String }) pageSchema.virtual('html') .get(function(){ var url = this.url function get(url) { return new (require('httpclient').HttpClient)({ method: 'GET', url: url }).finish().body.read().decodeToString(); } return get(url); }); //controller var page = new Page({ name: "Google" , desc: "Search engine" , url: "http://google.com" }); var html = page.html; 

基本上设置一个名为html的虚拟属性,它请求主体的url属性并返回它。

如果使用express和res.send(page)请确保为toJSON输出虚拟属性。

 pageSchema.set('toJSON', { virtuals: true }); 

__开头的文档属性不会保存到数据库中,因此您可以创build一个虚拟属性,让getter和setter使用this.__html

 pageSchema.virtual('html').get(function () { return this.__html; }).set(function (html) { this.__html = html; }); 

但是有一点需要注意:这个function没有logging,所以没有以__开头的内部属性列表,所以尽pipe不太可能,但是在将来内部实现可能会使用var称为__html

https://github.com/Automattic/mongoose/issues/2642