Tipo de objeto de esquema personalizado avanzado de mangosta

No pude encontrar ningún ejemplo de unavanzado tipo de esquema personalizado que implican objetos personalizados (oobjetos de valor) en Mangosta> = 4.4.

Imagine que quiero usar un tipo personalizado como:

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

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

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

A continuación, implemento un SchemaType personalizado como:

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

¿Cómo puedo asegurar que:

Cada vez que un nuevo objeto se "hidrata" de db (mangostaen eso), Tendré una instancia de Polygon y no un objeto plano. Entiendo que usará elcast función.assert(model.polygon instanceof Polygon)

Cada vez que guarde mi Modelo, el atributo Polígono debe codificarse y almacenarse como una representación de objeto simple (Polygon.prototype.toObject()) que en este caso es unArray objeto en mongodb.

Si yo usomodel.toObject() llamará recursivamente almodel.polygon.toObject() tener una representación completa del objeto plano del documento.

Respuestas a la pregunta(1)

Su respuesta a la pregunta