我正在尝试学习MongoDB / Node,我注意到在模式中我经常会看到类似这样的内容:
toObject: { virtuals: true }
toJSON: { virtuals: true }
这两行是什么意思?
答案 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;或者持久存储在数据库中。通常它们基于数据存储中的实际持久值。
但要真正澄清你的直接问题。仅限猫鼬'序列化'它基于"存储"的内部对象结构的内容。默认情况下的字段那么这两条线"真的"意思是:
toObject():这会生成" plain"或" raw"对象数据的表示没有所有其他的" mongoose magic"扩展对象的一部分。但"虚拟"的目的是使那些方法返回的对象的一部分。基本上只是普通对象,称为:
var model = Model.new({ "name": { "first": "Walter", "last": "White" });
console.log( model.toObject() );
toJSON():您可以显式调用此方法,如上所示,但它最常见的用法来自下面的JSON解析器,它隐式调用。同样的原则适用于上述。 "虚拟"包括序列化输出中这些方法的结果,例如:
var model = Model.new({ "name": { "first": "Walter", "last": "White" });
JSON.stringify( model, undefined, 2 );
所以第二种情况是"隐含"在对象上调用.toJSON()
方法。配置正在做的是告诉该方法不仅包括数据或"字段"存在于对象中,也是"虚拟"定义的方法和它们给出的输出。与.toObject()
相同。