2012-11-10 5 views
5

Ich habe einige Informationen über meine Mungo-Modelle, die vorübergehend sind. Aus Performancegründen möchte ich es nicht gegen das Modell speichern. Aber ich möchte diese Information Clients bereitstellen können, die sich mit meinem Server verbinden und danach fragen.Mungo-Schlüssel/Val-Set für Instanz wird nicht in JSON oder Console angezeigt. Warum?

Hier ist ein einfaches Beispiel:

var mongoose = require('mongoose'), 
    db = require('./dbconn').dbconn; 

var PersonSchema = new mongoose.Schema({ 
    name : String, 
    age  : Number, 
}); 

var Person = db.model('Person', PersonSchema); 
var fred = new Person({ name: 'fred', age: 100 }); 

Die Person Schema hat zwei Attribute, die ich gespeichert werden sollen (Name und Alter) .. Dies funktioniert .. und wir sehen in der Konsole:

console.log(fred); 

{name: 'fred', Alter: 100, _id: 509edc9d8aafee8672000001}

ich jedoch Ich habe ein Attribut ("status"), das sich schnell ändert und ich möchte das nicht in der Datenbank speichern. Aber ich möchte es dynamisch verfolgen und Clients bereitstellen, damit ich es als Schlüssel/Wert-Paar der Instanz hinzufüge.

fred.status = "alive"; 

Wenn wir schauen fred in der Konsole wieder nach dem "alive" key/val Paar Zugabe sehen wir wieder fred, aber sein Zustand ist nicht gezeigt:

{name: 'fred', Alter: 100, _id: 509edc9d8aafee8672000001}

Doch der Schlüssel/val Paar ist definitiv da .. wir sehen, dass:

console.log(fred.status); 

macht:

lebendig

Das gleiche gilt für die JSON-Repräsentation des Objektes, das ich für Kunden bin das Senden .. der "Status" ist nicht enthalten ..

Ich verstehe nicht warum ... kann jemand helfen?

Oder gibt es alternativ einen besseren Ansatz zum Hinzufügen von Attributen zu Mongoose-Schemas, die nicht in der Datenbank gespeichert werden?

+0

Ich denke, das ist etwas schrullig mit Mungo Objekten. Ich füge user.avatar immer an ihre Gravatar-URL an. – chovy

Antwort

9

folgendes zu Ihrem Schema hinzufügen sollte das tun, was Sie wollen:

PersonSchema.virtual('status').get(function() { 
    return this._status; 
}); 

PersonSchema.virtual('status').set(function(status) { 
    return this._status = status; 
}); 

PersonSchema.set('toObject', { 
    getters: true 
}); 

Dies fügt das virtuelle Attribut status - es wird nicht beibehalten werden, weil es ein virtuelles ist. Der letzte Teil wird benötigt, um die korrekte Protokollausgabe der Konsole zu ermöglichen. Von der docs:

Um alle virtuals in Ihrem console.log Ausgang angezeigt zu haben, stellen Sie die toObject Option {Getter: true}

Beachten Sie auch, dass Sie eine interne Eigenschaft verwenden müssen Name anders als status (hier benutzte ich _status). Wenn Sie denselben Namen verwenden, geben Sie beim Ausführen von get eine unendliche rekursive Schleife ein.

+0

Schön .. vielen Dank! Funktioniert gut, perfekt. –

+0

Neugierig .. zeigt sich in Console..s, bis in JSON nicht an Client gesendet .. –

+1

Sie können 'toObject' auf Ihrer Instanz vor dem Senden der Daten aufrufen. Ich bevorzuge es, 'toJSON' zu überschreiben, wie es [hier] (https://groups.google.com/d/topic/mongoose-orm/SHe_Fsso_44/discussion) zu sehen ist. –

1

Rufen Sie einfach .toObject() auf dem Datenobjekt.

Für Sie Code wie:

fred.toObject()

Verwandte Themen