猫鼬高级自定义模式对象类型

Mongoose advanced custom schema object type

我在 Mongoose >=4.4.

中找不到任何 高级 custom schema type involving custom objects (or value-objects) 的例子

假设我想使用像这样的自定义类型:

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);
}

我如何保证:

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

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

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

感谢@vkarpov15 github.com:

,我找到了解决方案
  1. SchemaType.prototype.cast() 需要 hydrate 来自 raw mongodb 的文档模型表示,并在无效数据的情况下抛出错误。

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

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