MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mungo:Was ist mit _doc los?

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:

  1. Mongoose-Code wird aufgerufen, bevor der Wert auf die Objektinstanz gesetzt wird (im Gegensatz zu einem einfachen JavaScript-Objekt)
  2. 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.
  3. Mongoose wird versuchen, Ihre Daten in den richtigen Typ umzuwandeln
  4. 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.