猫鼬 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的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:检查对象是不是为猫鼬对象

带有嵌套可选对象的猫鼬模式

扩展模式猫鼬中的“虚拟”继承方法不起作用

MongoDB / Mongoose 时间戳未更新

从父模式填充字段

从父模式填充字段