Mongoose高级自定义架构对象类型

Dar*_*rio 7 mongoose mongodb node.js mongoose-plugins mongoose-schema

我在Mongoose> = 4.4中找不到任何涉及自定义对象(或值对象)的高级 自定义模式类型的示例.

想象一下,我想使用自定义类型,如:

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

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

Polygon.prototype.toObject = function toObject() { return this.bounds; };
Run Code Online (Sandbox Code Playgroud)

接下来,我实现了一个自定义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);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能保证:

  1. 每当一个新对象从db(mongoose init)"水合"时,我将拥有一个Polygon实例,而不是一个普通对象.我明白它会使用这个cast 功能.assert(model.polygon instanceof Polygon)

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

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

Dar*_*rio 2

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

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

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

  3. model.toObject()/model.toJSON()当前不会对所有子级递归调用toObject()/ toJSON(),但看起来它将被修复。但我可以重载它作为分配自定义schema.methods.toObject()实例方法的临时解决方法。