Mongoose toObject:{virtuals:true}

我试图学习MongoDB / Node,我注意到在一个模式中,我经常看到这样的事情:

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

这两行意味着什么?

这不是“MongoDB”,而是针对mongooseODM。

Mongoose在模式定义中有一个“虚拟”字段的概念。 这基本上允许这个(从文档公然收集):

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

这基本上是“虚拟”领域的内容。 它们实际上是在文档“对象”上定义的“方法”,它提供的值不是“存储”或在数据库中保留的值。 通常它们基于来自数据存储的实际持续值。

但要真正清理你的直接问题。 Mongoose默认只会根据“stored”字段“序列化”内部对象结构的内容。 那么这两行“真”意味着什么:

  1. toObject() :这会产生对象数据的“普通”或“原始”表示,而不包含扩展对象的所有其他“mongoose魔术”部分。 但是“虚拟”的目的是使这些方法成为返回对象的一部分。 基本上只是简单的对象,被称为:

      var model = Model.new({ "name": { "first": "Walter", "last": "White" }); console.log( model.toObject() ); 
  2. toJSON() :你可以显式调用这个方法,就像上面显示的那样,但是最常见的用法是从下面的JSONparsing器中隐式地调用它。 上述同样的原则适用。 “虚拟”包括这些方法在序列化输出中的结果,例如:

      var model = Model.new({ "name": { "first": "Walter", "last": "White" }); JSON.stringify( model, undefined, 2 ); 

所以第二种情况是在对象上有一个“隐式”的.toJSON()方法调用。 configuration所做的是告诉这种方法不仅包括对象中存在的数据或“字段”,还包括定义的“虚拟”方法以及它们提供的输出。 .toObject()相同。