2016-06-29 21 views
6

Non ho trovato alcun esempio di avanzatocustom schema type che coinvolge oggetti personalizzati (o value-objects) in Mongoose> = 4.4.Mongoose avanzato schema personalizzato tipo di oggetto

Immaginate che io voglio usare un tipo personalizzato come:

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

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

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

Avanti, implemento uno SchemaType personalizzato come:

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

Come posso assicurare che:

  1. Ogni volta che un nuovo oggetto viene "idratato" da db (mangusta init), Avrò un'istanza Poligono e non un oggetto semplice. Capisco che utilizzerà la funzione cast . assert(model.polygon instanceof Polygon)

  2. Ogni volta che io salverò il mio modello l'attributo Poligono deve essere codificata e memorizzata come rappresentazione oggetto pianura (Polygon.prototype.toObject()) che in questo caso è un oggetto Array in MongoDB.

  3. Se si utilizza model.toObject() chiamerà in modo ricorsivo il model.polygon.toObject() per avere una rappresentazione di oggetto in chiaro del documento.

risposta

2

ho trovato una soluzione grazie a @ vkarpov15 su github.com:

  1. SchemaType.prototype.cast() è necessario per correttamente idratare il modello di documento da cruda rappresentazione MongoDB, e genera un errore in caso di non valida dati.

  2. Per personalizzare la persistenza di mongodb, ho dovuto implementare una funzione toBSON() nel mio prototipo di oggetto di tipo personalizzato (ad esempio Polygon).

  3. model.toObject()/model.toJSON() attualmente non chiama in modo ricorsivo toObject()/toJSON() su tutti i bambini, ma sembra che sarà fixed. Ma potrei sovraccaricarlo come soluzione temporanea che assegna un metodo di istanza personalizzato schema.methods.toObject().

Problemi correlati