将"虚拟"变量添加到mongoose模式?

fus*_*sio 21 mongoose node.js

我有以下文档架构:

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)

文档

  • 是的,但他们没有添加新字段..他们正在使用现有字段. (2认同)

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