Mongoose toObject和toJSON之间有什么区别?

Mongoose toObject和toJSON之间有什么区别?,mongoose,Mongoose,列出了toObject的功能、选项和示例 toJSON的Mongoose文档说选项与toObject相同,但没有解释toJSON的作用 toJSON与toObject选项完全相同,但仅适用于 调用文档的toJSON方法时 toJSON是toObject的别名吗?如果没有,区别是什么?查看显示,这两种方法都调用内部$toObject方法,但是toJSON经过一秒钟,true参数: Document.prototype.toObject=函数(选项){ 返回此.$toObject(选项); }; .

列出了
toObject
的功能、选项和示例

toJSON
的Mongoose文档说选项与toObject相同,但没有解释
toJSON
的作用

toJSON与toObject选项完全相同,但仅适用于 调用文档的toJSON方法时

toJSON
toObject
的别名吗?如果没有,区别是什么?

查看显示,这两种方法都调用内部
$toObject
方法,但是
toJSON
经过一秒钟,
true
参数:

Document.prototype.toObject=函数(选项){
返回此.$toObject(选项);
};
...
Document.prototype.toJSON=函数(选项){
返回此.$toObject(选项,true);
};

第二个参数确定
$toObject
是使用
toJSON
还是
toObject
模式选项作为其默认值。因此,除非这些模式选项配置不同,否则这两种方法是相同的。

在为
toObject
toJSON
方法开发插件时,我发现在保存操作期间也会调用
toObject
。这可能是有害的。例如,如果设置
toObject
(如我的)的插件更改字段,则更改的结果将被保留。

如前所述,
toJSON
toObject
之间没有区别。我猜,
toJSON
是为了支持
JSON.stringify
方法而创建的


从中,如果一个对象的函数是
toJSON
属性,
JSON.stringify
将使用
toJSON
函数来序列化对象,而不是对象本身。

对于我的用例,我得到的是:

  • .toJSON
    的优点是它由
    JSON.stringify
    自动使用。如果将模式选项
    toJSON
    设置为重新成形选项,则在使用该模式对文档进行字符串化时,将生成具有正确形状的对象

  • .toObject
    的优点是,有时候
    JSON.stringify
    会在断开文档和模式之间的链接后运行,因此不会发生重新成形。在这种情况下,只需使用这些选项调用document方法
    toObject
    ,即可获得具有适当形状的对象

范例

  • 具有:
const重塑选项={
//include.id(它是虚拟的)
虚拟人:是的,
//排除
versionKey:false,
//排除
转换:功能(文档、ret){
删除检索id;
返回ret;
},
};
const friendSchema=mongoose.Schema({
givenName:字符串,
familyName:String,
},{toJSON:reformingoptions});
const friendModel=mongoose.model('Friend',friendSchema);
const john=friendModel.findOne({givenName:'john'});
如果(!约翰){
json({error:'No John Found'});
}
  • 声明

    JSON.stringify(约翰);
    
    返回:

{
“id”:“…”,
“吉文纳姆”:“约翰”,
“familyName”:“Doe”
}
  • 但这一同样无辜的声明

    JSON.stringify({
    …约翰,//传播中断了链接
    角色:“虚拟朋友”
    })
    
    突然回来:

{
“_id”:“…”,
“吉文纳姆”:“约翰”,
“familyName”:“Doe”,
“_v”:0,
“角色”:“虚拟朋友”
}
  • 所以我用

    res.json({
    …john.toObject(重塑选项),
    角色:“虚拟朋友”
    })
    
    要获得:

{
“id”:“…”,
“吉文纳姆”:“约翰”,
“familyName”:“Doe”,
“角色”:“虚拟朋友”
}

在Github上可能会出现这样的问题:@steampowered Fred我使用的是.toObject(),而在我从docs.toObject()中分配值的对象上,我正在更改值,但在调用docs.save时,新对象更改的值在MongoDB中不存在。这是我想要的,所以一切对我来说都很完美,你能告诉我这对你的案子有什么坏处吗?我不明白你的意思?作为旁注,使用不同的toJSON配置实际上是有意义的-你可以在从控制器返回对象之前进行一些转换(在express res.json(object)中调用json.stringify,即object.toJSON)-例如,取消填充一些条目以避免堆栈溢出。。。