Mongoose 高级自定义模式对象类型

Posted

技术标签:

【中文标题】Mongoose 高级自定义模式对象类型【英文标题】:Mongoose advanced custom schema object type 【发布时间】:2016-10-31 21:06:15 【问题描述】:

我在 Mongoose >=4.4 中找不到任何涉及自定义对象(或 value-objects)的高级 custom schema type 示例。

假设我想使用自定义类型,例如:

function Polygon(c) 
  this.bounds = [ /* some data */ ];
  this.npoints = /* ... */
  /* ... initialize polygon ... */
;

Polygon.prototype.area = function surfaceArea()  /**/ ;

Polygon.prototype.toObject = function toObject()  return this.bounds; ;

接下来,我实现了一个自定义 SchemaType,例如:

function PolygonType(key, options) 
  mongoose.SchemaType.call(this, key, options, 'PolygonType');


PolygonType.prototype = Object.create(mongoose.SchemaType.prototype);

PolygonType.prototype.cast = function(val) 
  if (!val) return null;
  if (val instanceof Polygon) return val;
  return new Polygon(val)


PolygonType.prototype.default = function(val) 
  return new Polygon(val);

我如何保证:

    每次从 db (mongoose init) 中“水合”一个新对象时,我都会有一个 Polygon 实例而不是普通对象。我知道它将使用cast 功能。 assert(model.polygon instanceof Polygon)

    每次我保存模型时,多边形属性都应该是 编码并存储为普通对象表示 (Polygon.prototype.toObject()) 在这种情况下是 mongodb 中的 Array 对象。

    如果我使用 model.toObject(),它将递归调用 model.polygon.toObject() 以获得文档的完整纯对象表示。

【问题讨论】:

【参考方案1】:

感谢github.com上的@vkarpov15,我找到了解决方案:

    SchemaType.prototype.cast() 需要从 raw mongodb 表示中正确水合文档模型,并在数据无效的情况下抛出错误。

    要自定义 mongodb 持久性,我必须在我的自定义类型对象原型(即 Polygon)中实现 toBSON() 函数。

    model.toObject() / model.toJSON() 目前不会在所有子节点上递归调用 toObject()/toJSON(),但看起来它将是 fixed。但我可以将其作为临时解决方法重载,分配自定义 schema.methods.toObject() 实例方法。

【讨论】:

以上是关于Mongoose 高级自定义模式对象类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在高级自定义字段插件中使用用户字段类型显示用户名

Mongoose

Mongoose Schema 类型作为 TypeScript 的自定义接口?

javascript高级编程笔记06(面相对象2)

尝试传递自定义 oracle 类型对象映射时的名称模式无效

JavaScript之面向对象学习七(动态原型模式和寄生构造函数模式创建自定义类型)