返回

揭秘 Mongoose 的 toObject 和 toJSON 神秘差异

后端

toObject 与 toJSON 的异同

Mongoose 的 toObject 和 toJSON 方法都可将文档对象转换为 JSON 对象。它们的主要区别在于:

  • toObject :该方法返回一个普通 JavaScript 对象,它不会包含任何 Mongoose 特有的属性或方法。这对于与外部库或 API 交互非常有用,因为它们通常不认识 Mongoose 特有的属性或方法。
  • toJSON :该方法返回一个特殊的 JSON 对象,它包含 Mongoose 特有的属性和方法。这对于在 Mongoose 中使用文档对象非常有用,因为这些属性和方法可以帮助您访问和操作文档数据。

toObject 和 toJSON 的应用场景

根据上述区别,我们可以将 toObject 和 toJSON 方法应用于不同的场景:

  • toObject :适用于将文档对象转换为普通 JavaScript 对象的场景,例如:
    • 与外部库或 API 交互
    • 将文档对象存储在非 Mongoose 数据库中
    • 将文档对象传递给前端模板引擎
  • toJSON :适用于在 Mongoose 中使用文档对象的场景,例如:
    • 在 Mongoose 查询中使用文档对象
    • 在 Mongoose 模型中使用文档对象
    • 将文档对象存储在 Mongoose 数据库中

MongooseMap 和重写 toJSON 的子文档

除了上述区别外,toObject 和 toJSON 方法在处理 MongooseMap 和重写了 toJSON 的子文档时也会表现出差异。

  • MongooseMap :MongooseMap 是 Mongoose 中的一种特殊类型,它允许您存储键值对。当您将包含 MongooseMap 的文档对象转换为 JSON 对象时,toObject 方法会将 MongooseMap 转换为普通的 JavaScript 对象,而 toJSON 方法会将 MongooseMap 转换为特殊的 JSON 对象。
  • 重写 toJSON 的子文档 :如果您在子文档的 schema 中重写了 toJSON 方法,那么当您将包含该子文档的文档对象转换为 JSON 对象时,toObject 方法会使用默认的 toJSON 方法,而 toJSON 方法会使用您重写的 toJSON 方法。

注意事项

在使用 toObject 和 toJSON 方法时,需要注意以下几点:

  • 如果您在文档对象中使用了虚拟属性,那么这些虚拟属性不会被 toObject 和 toJSON 方法包含在 JSON 对象中。
  • 如果您在文档对象中使用了自定义方法,那么这些自定义方法不会被 toObject 和 toJSON 方法包含在 JSON 对象中。
  • 如果您在文档对象中使用了私有属性或方法,那么这些私有属性或方法不会被 toObject 和 toJSON 方法包含在 JSON 对象中。

总结

通过本文的介绍,相信您对 Mongoose 的 toObject 和 toJSON 方法有了更深入的了解。希望这些信息能够帮助您在项目中正确使用这些方法,并避免常见的错误。