猫鼬 toObject: virtuals: true
Posted
技术标签:
【中文标题】猫鼬 toObject: virtuals: true【英文标题】:Mongoose toObject: virtuals: true 猫鼬 toObject: virtuals: true 【发布时间】:2015-01-10 15:15:04 【问题描述】:我正在尝试学习 MongoDB/Node,我注意到在架构中我经常看到这样的内容:
toObject: virtuals: true
toJSON: virtuals: true
这两行是什么意思?
【问题讨论】:
您知道这里的一般做法是“接受”对您有帮助的答案。这是答案评级数字旁边的大“勾号”。这么说是因为您没有接受对您提出的所有问题的单一答案。他们不可能都是错的,所以接受他们。 你读过the documentation关于这些选项的内容吗? 【参考方案1】:这不是“MongoDB”,而是特定于 mongoose ODM。
Mongoose 在架构定义中有"virtual" 字段的概念。这基本上允许这样做(从文档中公然收集):
var personSchema = new Schema(
name:
first: String,
last: String
);
var Person = mongoose.model( "Person", personSchema );
但假设您只想“存储”这些属性,但您可以在名为“fullname”的代码中访问某些内容。这就是“虚拟”的用武之地:
personSchema.virtual("name.full").get(function ()
return this.name.first + ' ' + this.name.last;
);
现在我们可以这样做了:
var bad = new Person(
name: "first": "Walter", "last": "White"
);
console.log("%s is insane", bad.name.full); // Walter White is insane
所以name.full
实际上并不存在于数据中,它只是代码中的模式表示。但当然“绑定”到一个函数,该函数使用对象中存在的实际数据来创建一个方法,该方法返回一个结合方法中代码的两个字段的值。
这基本上就是“虚拟”字段的意义所在。它们实际上是在文档“对象”上定义的“方法”,它们提供了一个未“存储”或保留在数据库中的值。通常它们基于数据存储中的实际持久值。
但要真正澄清您的直接问题。默认情况下,Mongoose 仅基于“存储”字段“序列化”其内部对象结构的内容。那么这两行“真正”的意思是:
toObject():这会产生对象数据的“普通”或“原始”表示,而没有扩展对象的所有其他“猫鼬魔术”部分。但是“虚拟”的目的是使这些方法成为返回对象的一部分。基本上只是普通对象,称为:
var model = Model.new( "name": "first": "Walter", "last": "White" );
console.log( model.toObject() );
toJSON():您可以显式调用此方法,如上所示,但最常见的用法是来自下面的 JSON 解析器,其中隐式调用它。与上述相同的原则适用。 “virtuals”包括序列化输出中这些方法的结果,例如:
var model = Model.new( "name": "first": "Walter", "last": "White" );
JSON.stringify( model, undefined, 2 );
所以第二种情况是对对象的.toJSON()
方法的“隐式”调用。配置所做的是告诉该方法不仅包括对象中存在的数据或“字段”,还包括定义的“虚拟”方法和它们给出的输出。 .toObject()
也一样。
【讨论】:
谢谢,但是 "set('toObject': virtuals: true )" 到底是做什么的呢?我得到了虚拟的概念,但在我看来,您只是在设置一个名为“toObject”的对象键并将其设置为对象数据 virtuals:是的,它在这里试图实现什么? 感谢您编辑解释 toObject() 和 toJSON() 的答案。以上是关于猫鼬 toObject: virtuals: true的主要内容,如果未能解决你的问题,请参考以下文章