2016-06-29 39 views
6

Ich konnte kein Beispiel für eine erweitertecustom schema type mit benutzerdefinierten Objekten (oder value-objects) in Mongoose> = 4.4 finden.Mongoose erweiterte benutzerdefinierte Schema Objekttyp

Stellen Sie sich vor, dass ich einen benutzerdefinierten Typen wie verwenden mag:

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

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

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

Als nächst ich ein benutzerdefiniertes Schema implementieren 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); 
} 

Wie kann ich versichern:

  1. Jedes Mal, wenn ein neues Objekt von db "hydratisiert" wird (Mungo init), Ich werde eine Polygon Instanz haben und kein einfaches Objekt. Ich verstehe, dass es die cast Funktion verwenden wird. assert(model.polygon instanceof Polygon)

  2. Jedes Mal, werde ich mein Modell des Polygon-Attribut speichern sollte codiert und als reine Objektdarstellung (Polygon.prototype.toObject()), dass in diesem Fall ein Array Objekt in mongodb gespeichert werden.

  3. Wenn ich model.toObject()10 verwende, wird es die model.polygon.toObject() rekursiv aufrufen, um eine vollständige einfache Objektdarstellung des Dokuments zu haben.

Antwort

2

fand ich eine Lösung dank @ vkarpov15 auf github.com:

  1. SchemaType.prototype.cast() benötigt wird, um einen Fehler bei ungültig richtig Hydrat das Dokumentenmodell von roh mongodb Darstellung und werfen Daten.

  2. mongodb Ausdauer anzupassen, ich hatte eine toBSON() Funktion in meinem benutzerdefinierten Typ Objekt Prototyp (d Polygon) zu implementieren.

  3. model.toObject()/model.toJSON() zur Zeit nicht nennen toObject()/toJSON() auf alle Kinder rekursiv, aber es sieht aus wie es fixed sein wird. Aber ich könnte es als vorübergehende Umgehung überladen eine benutzerdefinierte schema.methods.toObject() Instanz Methode zuweisen.

Verwandte Themen