Aktualisieren
Vielleicht habe ich Ihre ursprüngliche Frage falsch verstanden, aber jetzt sieht es so aus, als hätte sich die Art Ihrer Frage geändert, sodass die folgenden Informationen nicht relevant sind, aber ich belasse es dabei. :)
Ich habe deinen Code getestet und bei mir funktioniert er einwandfrei. Mongoose führt keinen speziellen Code aus, wenn Sie Eigenschaften festlegen, die nicht Teil des Schemas sind (oder einige andere spezielle Eigenschaften). JavaScript unterstützt derzeit keinen Aufrufcode für Eigenschaften, die noch nicht vorhanden sind (daher kann Mongoose dem Satz von goo
nicht in die Quere kommen Eigentum zum Beispiel).
Wenn Sie also die Eigenschaft festlegen:
foo.goo = { c: 1 };
Mongoose ist nicht beteiligt. Wenn Ihre console.log
etwas anderes als der von Ihnen angezeigte Code war, konnte ich sehen, dass es möglicherweise falsch gemeldet wurde.
Zusätzlich, wenn Sie send
die Ergebnisse zurück als JSON, JSON.stringify
aufgerufen wird, was toString
aufruft auf Ihrem Mongoose-Modell. In diesem Fall verwendet Mongoose nur die im Schema definierten Eigenschaften. Daher werden standardmäßig keine zusätzlichen Eigenschaften zurückgesendet. Sie haben die Art der data
geändert Array, um direkt auf die Mongoose-Daten zu zeigen, wodurch dieses Problem vermieden wird.
Details zum normalen Verhalten
Wenn Sie die Eigenschaft goo
setzen Mit Mongoose passieren einige Dinge. Mongoose erstellt Property-Getter/Setter über Object.defineProperty
(einige Dokumente
). Wenn Sie also goo
setzen -Eigenschaft, die Sie als [String]
definiert haben , passieren einige Dinge:
- Mongoose-Code wird aufgerufen, bevor der Wert auf die Objektinstanz gesetzt wird (im Gegensatz zu einem einfachen JavaScript-Objekt)
- Mongoose erstellt (optional) ein Array zum Speichern der Daten (ein
MongooseArray
), die die Array-Daten enthält. Da Sie in dem von Ihnen bereitgestellten Beispiel kein Array übergeben haben, wird es erstellt. - Mongoose wird versuchen, Ihre Daten in den richtigen Typ umzuwandeln
- Es wird
toString
aufgerufen auf den im Rahmen des Casts übergebenen Daten.
Das Ergebnis ist also, dass das Dokument jetzt ein Array mit einem toString
enthält Version des übergebenen Objekts.
Wenn Sie den Inhalt von goo
überprüft haben -Eigenschaft sehen Sie, dass es sich jetzt um ein Array mit einem einzelnen Element handelt, bei dem es sich um eine Zeichenfolge handelt, die [object Object]
enthält . Wenn Sie einen einfacheren Typ ausgewählt oder den Zielspeichertyp für Eigenschaften gefunden hätten, würden Sie sehen, dass eine einfache Gleichheitsprüfung funktioniert hätte.