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
会在断开文档和模式之间的链接后运行,因此不会发生重新成形。在这种情况下,只需使用这些选项调用document方法JSON.stringify
,即可获得具有适当形状的对象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)-例如,取消填充一些条目以避免堆栈溢出。。。