首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬toObject:{虚拟人:真}

猫鼬toObject:{虚拟人:真}
EN

Stack Overflow用户
提问于 2014-11-13 13:00:54
回答 1查看 8.8K关注 0票数 9

我正在努力学习MongoDB/Node,我注意到在模式中我经常看到这样的情况:

代码语言:javascript
复制
toObject: { virtuals: true }
toJSON: { virtuals: true }

这两行是什么意思?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 13:15:55

这不是"MongoDB“,而是专门针对猫鼬ODM的。

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

代码语言:javascript
复制
var personSchema = new Schema({
    name: {
        first: String,
        last: String
    }
});

var Person = mongoose.model( "Person", personSchema );

但是,假设您只想“存储”这些属性,然后可以在代码“全名”中访问一些内容。这就是“虚拟人”进来的地方:

代码语言:javascript
复制
personSchema.virtual("name.full").get(function () {
    return this.name.first + ' ' + this.name.last;
});

现在我们可以做这样的事情:

代码语言:javascript
复制
var bad = new Person({
    name: { "first": "Walter", "last": "White" }
});

console.log("%s is insane", bad.name.full); // Walter White is insane

所以name.full实际上并不存在于数据中,它只是代码中的模式表示。但是,当然,“绑定”到一个函数,该函数使用对象中的实际数据来生成一个方法,该方法将方法中的代码中的两个字段组合在一起返回一个值。

这基本上就是“虚拟”字段的意义所在。它们实际上是在文档"object“上定义的”方法“,这些方法表示的值不是”存储“的或持久化在数据库中的。通常它们是基于数据存储中的实际持久化值。

但要真正澄清你的直接问题。默认情况下,猫鼬只会根据“存储”字段“序列化”其内部对象结构的内容。所以这两句“真正”的意思是:

  1. toObject():这将生成对象数据的“普通”或“原始”表示,而不需要扩展对象的所有其他“猫鼬魔法”部分。但是,“虚拟人”的目的是使这些方法返回对象的一部分。基本上只是简单的对象,称为: var model = Model.new({ "name":{ "first":"Walter","last":"White“});console.log( model.toObject( );
  2. toJSON():您可以显式地调用此方法,如上面所示,但它最常见的用法来自JSON解析器,如下面所示,它被隐式调用。同样的原则也适用于上面。"virtuals“包括序列化输出中这些方法的结果,如: var model = Model.new({ "name":{ "first":"Walter",“name”:"White“});JSON.stringify(模型,未定义,2 );

因此,第二种情况是对象上的.toJSON()方法的“隐式”调用。配置所做的是告诉该方法不仅包括对象中的数据或“字段”,还包括定义的“虚拟”方法及其提供的输出。.toObject()也一样。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26909509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档