gpt4 book ai didi

javascript - Mongoose toObject : { virtuals: true }

转载 作者:IT老高 更新时间:2023-10-28 13:19:48 28 4
gpt4 key购买 nike

我正在尝试学习 MongoDB/Node,但我注意到在架构中我经常看到这样的内容:

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

这两行是什么意思?

最佳答案

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

这基本上就是“虚拟”字段的意义所在。它们实际上是在文档“对象”上定义的“方法”,它们提供了一个未“存储”或保留在数据库中的值。通常它们基于数据存储中的实际持久值。

但要真正澄清您的直接问题。默认情况下,Mongoose 仅​​基于“存储”字段“序列化”其内部对象结构的内容。那么这两行“真正”的意思是:

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

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

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

所以第二种情况是对对象的 .toJSON() 方法进行“隐式”调用。配置所做的是告诉该方法不仅包括对象中存在的数据或“字段”,还包括定义的“虚拟”方法和它们给出的输出。 .toObject() 也一样。

关于javascript - Mongoose toObject : { virtuals: true },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909509/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com