Mongoose toObject:{virtuals:true}

时间:2014-11-13 13:00:54

标签: javascript node.js mongodb mongoose mongodb-query

我正在尝试学习MongoDB / Node,我注意到在模式中我经常会看到类似这样的内容:

toObject: { virtuals: true }
toJSON: { virtuals: true }

这两行是什么意思?

1 个答案:

答案 0 :(得分:12)

这不是" MongoDB"但具体到猫鼬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实际上并不存在于数据中,它只是代码中的模式表示。但当然"捆绑"到一个函数,它使用对象中存在的实际数据来创建一个方法,该方法返回一个值,该值组合了方法中每个代码的两个字段。

这基本上是什么"虚拟"领域是关于。它们实际上是"方法"在文件"对象"上定义表示不存储的值#34;或者持久存储在数据库中。通常它们基于数据存储中的实际持久值。

但要真正澄清你的直接问题。仅限猫鼬'序列化'它基于"存储"的内部对象结构的内容。默认情况下的字段那么这两条线"真的"意思是:

  1. toObject():这会生成" plain"或" raw"对象数据的表示没有所有其他的" mongoose magic"扩展对象的一部分。但"虚拟"的目的是使那些方法返回的对象的一部分。基本上只是普通对象,称为:

     var model = Model.new({ "name": { "first": "Walter", "last": "White" });
     console.log( model.toObject() );
    
  2. toJSON():您可以显式调用此方法,如上所示,但它最常见的用法来自下面的JSON解析器,它隐式调用。同样的原则适用于上述。 "虚拟"包括序列化输出中这些方法的结果,例如:

     var model = Model.new({ "name": { "first": "Walter", "last": "White" });
     JSON.stringify( model, undefined, 2 );
    
  3. 所以第二种情况是"隐含"在对象上调用.toJSON()方法。配置正在做的是告诉该方法不仅包括数据或"字段"存在于对象中,也是"虚拟"定义的方法和它们给出的输出。与.toObject()相同。