我有以下文档架构:
var pageSchema = new Schema({
name: String
, desc: String
, url: String
})
Run Code Online (Sandbox Code Playgroud)
现在,在我的应用程序中,我想在对象内部有页面的html源代码,但我不想将它存储在数据库中.
我应该创建一个"本地"增强对象,它具有对db文档的引用吗?
function Page (docModel, html) {
this._docModel = docModel
this._html = html
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通过添加"虚拟"字段直接使用文档模型?
gus*_*nke 37
这在猫鼬中是完全可能的.
查看此示例,取自他们的文档:
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
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,该属性没有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];
});
Run Code Online (Sandbox Code Playgroud)
cho*_*ovy 13
我实际上没有测试过这个,但这个想法似乎值得:
//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;
Run Code Online (Sandbox Code Playgroud)
基本上设置一个名为virtual的属性html,该url属性请求body的body 并返回它.
如果您使用express和,请确保为toJSON启用虚拟属性的输出res.send(page).
pageSchema.set('toJSON', {
virtuals: true
});
Run Code Online (Sandbox Code Playgroud)
tec*_*ris 12
开头的文档属性__不会持久保存到db,因此您可以创建虚拟属性并使用getter和setterthis.__html
pageSchema.virtual('html').get(function () {
return this.__html;
}).set(function (html) {
this.__html = html;
});
Run Code Online (Sandbox Code Playgroud)
但这有点需要注意:这个功能没有记录,所以没有内部属性列表,__ 因此有可能,尽管不太可能,将来内部实现可能会开始使用一个名为var的内容__html
https://github.com/Automattic/mongoose/issues/2642
| 归档时间: |
|
| 查看次数: |
26410 次 |
| 最近记录: |