实例上的Mongoose键/ val不会显示在JSON或控制台中。为什么?

我有一些短暂的mongoose模型的信息。 出于性能的原因,我不希望存储它对模型..但我希望能够提供这个信息给客户端连接到我的服务器,并要求它。

这是一个简单的例子:

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 }); 

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

 console.log(fred); 

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

我确实有一个属性(“状态”),迅速变化,我不想将其存储在数据库..但我想要dynamic跟踪它,并提供给客户端,所以我把它添加到实例作为一个键/ val对。

 fred.status = "alive"; 

如果我们在添加“alive”键/ val对之后再次查看控制台中的fred ,我们再次看到fred ,但是他的状态并没有显示出来:

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

然而,键/ VAL对肯定是在那里..我们看到:

 console.log(fred.status); 

呈现:

我正在发送给客户的对象的JSON表示也是如此。“状态”不包括在内。

我不明白为什么..任何人都可以帮忙?

或者,还有一种更好的方法可以将属性添加到未保存到数据库的mongoose模式中吗?

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

 PersonSchema.virtual('status').get(function() { return this._status; }); PersonSchema.virtual('status').set(function(status) { return this._status = status; }); PersonSchema.set('toObject', { getters: true }); 

这增加了虚拟属性status – 它不会被保留,因为它是虚拟的。 最后一部分是需要使您的控制台日志输出正确。 从文档 :

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

另请注意,您需要使用内部属性名称而不是status (在这里我使用了_status )。 如果使用相同的名称,则在执行get时会进入无限recursion循环。

只需在数据对象上调用.toObject()

对于你的代码将会是这样的:

fred.toObject()