Frage Mungo-Schlüssel / Val-Set für Instanz wird nicht in JSON oder Console angezeigt. Warum?


Ich habe einige Informationen über meine Mungo-Models, 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.

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

Das Personenschema hat zwei Attribute, die ich speichern möchte (Name und Alter). Das funktioniert .. und wir sehen in der Konsole:

console.log(fred);

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

Ich habe jedoch 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 der Instanz als Schlüssel hinzufüge. val-Paar.

fred.status = "alive";

Wenn wir uns anschauen Fred in der Konsole wieder nach dem Hinzufügen der "lebenden" Schlüssel / val-Paar sehen wir wieder Fred, aber sein Status wird nicht angezeigt:

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

Aber das Schlüssel / Wert-Paar ist definitiv da ... wir sehen das:

console.log(fred.status);

rendert:

am Leben

Dasselbe gilt für die JSON-Repräsentation des Objekts, das ich an Kunden sende. 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?


5
2017-11-10 23:14


Ursprung


Antworten:


Das Hinzufügen des folgenden zu Ihrem Schema sollte 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 hinzu status - Es wird nicht beibehalten, weil es ein virtueller ist. Der letzte Teil wird benötigt, um die korrekte Protokollausgabe der Konsole zu ermöglichen. Von dem Dokumente:

Wenn alle virtuellen Dateien in der Ausgabe "console.log" angezeigt werden sollen, legen Sie die Option fest   toObject-Option zu {getters: true}

Beachten Sie außerdem, dass Sie einen anderen internen Eigenschaftsnamen als verwenden müssen status (Hier habe ich gebraucht _status). Wenn Sie denselben Namen verwenden, geben Sie beim Ausführen von get eine unendliche rekursive Schleife ein.


9
2017-11-11 03:26



Einfach anrufen .toObject() auf dem Datenobjekt.

Für Sie wird Code wie sein:

fred.toObject()


1
2018-01-18 10:09