实例上的Mongoose key/val设置不在JSON或Console中显示..为什么?

Dun*_*n_m 5 mongoose node.js

我有一些关于我的猫鼬模型的信息是瞬态的.出于性能原因,我不希望将其存储在模型中..但我确实希望能够将这些信息提供给连接到我的服务器并要求它的客户端.

这是一个简单的例子:

 var mongoose = require('mongoose'),
     db = require('./dbconn').dbconn;

 var PersonSchema = new mongoose.Schema({
  name    : String,
  age     : Number,
});

var Person = db.model('Person', PersonSchema);
var fred = new Person({ name: 'fred', age: 100 });
Run Code Online (Sandbox Code Playgroud)

Person模式有两个我想要存储的属性(名称和年龄)..这有效..我们在控制台中看到:

console.log(fred);
Run Code Online (Sandbox Code Playgroud)

{name:'fred',年龄:100,_id:509edc9d8aafee8672000001}

但我确实有一个属性("状态")快速更改,我不想将其存储在数据库中..但我确实想要动态跟踪它并将其提供给客户端,因此我将其作为键添加到实例中/对.

fred.status = "alive";
Run Code Online (Sandbox Code Playgroud)

如果我们看一下弗雷德加入了"活着"键/值对后,在控制台再次,我们再次看到弗雷德,但他表示未启用状态:

{name:'fred',年龄:100,_id:509edc9d8aafee8672000001}

然而,键/值对肯定存在..我们看到:

console.log(fred.status);
Run Code Online (Sandbox Code Playgroud)

呈现:

我发送给客户的对象的JSON表示也是如此."状态"不包括在内.

我不明白为什么..有人可以帮忙吗?

或者,是否有更好的方法将属性添加到未持久保存到数据库的mongoose模式?

Dav*_*don 9

将以下内容添加到您的架构应该做你想要的:

PersonSchema.virtual('status').get(function() {
  return this._status;
});

PersonSchema.virtual('status').set(function(status) {
  return this._status = status;
});

PersonSchema.set('toObject', {
  getters: true
});
Run Code Online (Sandbox Code Playgroud)

这会添加虚拟属性status- 它不会被保留,因为它是虚拟的.最后一部分需要正确地使您的控制台日志输出.来自文档:

要在console.log输出中显示所有虚拟,请将toObject选项设置为{getters:true}

另请注意,您需要使用除status(此处使用_status)之外的内部属性名称.如果使用相同的名称,则在执行get时将进入无限递归循环.

  • 您还可以在[here](http://mongoosejs.com/docs/guide.html#toJSON)中对`toJSON`启用`getters`,这样您就不必重写该方法. (3认同)