Mongoose erweiterter benutzerdefinierter Schemaobjekttyp

Ich konnte kein Beispiel für ein @ find advanced custom schema type mit benutzerdefinierten Objekten (oder value-objects) in Mongoose> = 4.4.

Stellen Sie sich vor, ich möchte einen benutzerdefinierten Typ verwenden wie:

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

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

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

Nächste implementiere ich ein benutzerdefiniertes SchemaType wie:

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

ie kann ich versichern, dass:

Jedes Mal, wenn ein neues Objekt von db (mongoose @ "hydratisiert" widri) Habe ich eine Polygon-Instanz und kein einfaches Objekt. Ich verstehe, es wird das @ verwendcast Funktion.assert(model.polygon instanceof Polygon)

Jedes Mal, wenn ich mein Modell speichere, sollte das Polygon-Attribut codiert und als einfache Objektdarstellung gespeichert werden Polygon.prototype.toObject()) das ist in diesem Fall einArray Objekt in Mongodb.

Wenn ich @ benutmodel.toObject() es wird rekursiv das @ aufrufmodel.polygon.toObject(), um eine vollständige, einfache Objektdarstellung des Dokuments zu erhalten.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage