5

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

这是一个简单的例子:

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

{ 姓名:“弗雷德”,年龄:100,_id:509edc9d8aafee8672000001 }

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

fred.status = "alive";

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

{ 姓名:“弗雷德”,年龄:100,_id:509edc9d8aafee8672000001 }

然而,key/val 对肯定存在.. 我们看到:

console.log(fred.status);

呈现:

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

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

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

4

3 回答 3

9

将以下内容添加到您的架构中应该可以满足您的要求:

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时会进入无限递归循环。

于 2012-11-11T03:26:54.240 回答
2

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

对你来说,代码如下:

fred.toObject()

于 2013-01-18T10:09:41.130 回答
0

这非常有帮助。我自己不得不为此挣扎。就我而言,我从猫鼬那里得到了一份文件。当我添加一个新密钥时,如果我 console.log 它,则该密钥对对象不可见。当我搜索密钥 (console.log(data.status) 时,我可以在日志中看到它,但如果我记录了整个对象,则看不到它。

阅读此响应线程后,它起作用了。

例如,我从 MongoDB 调用中得到了一个像这样的对象:

`Model.find({}).then(result=> {
    //console.log(result);// [{ name:'John Doe', email:'john@john.com'}];

    //To add another key to the result, I had to change that result like this:
    var d = result[0];
    var newData = d.toJSON();
    newData["status"] = "alive";
    console.log(newData);// { name:'John Doe', email:'john@john.com', status:'alive'};
}).catch(err=>console.log(err))`

希望这对其他人有帮助。快乐编码

于 2019-01-27T18:35:16.107 回答