2014-11-13 15 views
5

Sto cercando di imparare MongoDB/Node e ho notato che in uno schema vedo spesso qualcosa di simile:Mongoose ToObject: {virtuali: true}

toObject: { virtuals: true } 
toJSON: { virtuals: true } 

Che cosa significano queste due righe significano?

+0

Sapete che la pratica generale qui è quella di "accettare" le risposte che vi aiutano. Questa è una grande cosa "tick" accanto al numero della valutazione della risposta. Dicendo questo perché non hai accettato una sola risposta a tutte le domande che hai posto. Non possono essere tutti sbagliati, quindi accettali. –

+0

Hai letto [la documentazione] (http://mongoosejs.com/docs/guide.html#toJSON) su queste opzioni? – JohnnyHK

risposta

8

Questo non è "MongoDB" ma specifico per l'ODM mangusta.

Mongoose ha un concetto di campi "virtual" nella definizione dello schema. Questo permette in sostanza questo (spigolare palese dalla documentazione):

var personSchema = new Schema({ 
    name: { 
     first: String, 
     last: String 
    } 
}); 

var Person = mongoose.model("Person", personSchema); 

Ma supponiamo che si vuole solo "store" tali proprietà, ma poi hanno qualcosa che si può accedere in codice chiamato "fullname". Questo è dove "virtuali" sono disponibili in:

personSchema.virtual("name.full").get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

Ora siamo in grado di fare qualcosa di simile:

var bad = new Person({ 
    name: { "first": "Walter", "last": "White" } 
}); 

console.log("%s is insane", bad.name.full); // Walter White is insane 

Così il name.full non esiste effettivamente nei dati, è solo una rappresentazione schema in codice. Ma naturalmente "legato" a una funzione che utilizza i dati effettivi presenti nell'oggetto per creare un metodo che restituisce un valore che combina i due campi per il codice nel metodo.

Questo è praticamente il significato dei campi "virtuali". Sono in realtà "metodi" definiti sul documento "oggetto" che presenta un valore che non è "memorizzato" o persistente nel database. Di solito si basano su valori effettivi persistenti dall'archiviazione dei dati.

Ma per chiarire davvero la tua domanda diretta. Mongoose "serializza" solo il contenuto della sua struttura di oggetti interna basata sui campi "memorizzati" per impostazione predefinita. Così che cosa quelle due righe "davvero" media sono:

  1. ToObject(): Questo produce una rappresentazione "semplice" o "raw" dei dati oggetto senza tutte le altre parti "magici mangusta" del oggetto esteso. Ma lo scopo dei "virtual" è di rendere quei metodi parte dell'oggetto restituito. Fondamentalmente solo l'oggetto pianura, chiamato come:

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    console.log(model.toObject()); 
    
  2. toJSON(): È possibile chiamare questo metodo in modo esplicito e proprio come mostrato in precedenza, ma è l'uso più comune è da un parser JSON come qui di seguito in cui è implicitamente chiamato. Gli stessi principi si applicano come sopra. Le "virtuali" include il risultato di tali metodi in uscita serializzato, quali:

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    JSON.stringify(model, undefined, 2); 
    

Quindi secondo caso v'è una chiamata "implicita" del metodo .toJSON() sull'oggetto. Ciò che la configurazione sta facendo è dire che il metodo non solo include dati o "campi" presenti nell'oggetto, ma anche i metodi "virtuali" definiti e l'output che danno. Lo stesso per .toObject().

+0

Grazie, ma cosa fa "set ('toObject': {virtuals: true})" fa esattamente? Prendo il concetto di un virtuale ma questo per me sembra che tu stia semplicemente impostando un oggetto chiave chiamato 'toObject' e impostalo su un virtual di dati dell'oggetto: vero, che cosa sta cercando di ottenere qui? – saeho

+0

Grazie per aver modificato la risposta per spiegare toObject() e toJSON(). – saeho

+0

toObject undefined – John