更新
元の質問を誤解したかもしれませんが、質問の性質が変わったように見えるため、以下の情報は関係ありませんが、そのままにしておきます。 :)
私はあなたのコードをテストしました、そしてそれは私にとってうまくいきます。スキーマの一部ではないプロパティ(または他のいくつかの特別なプロパティ)を設定すると、Mongooseは特別なコードを実行しません。 JavaScriptは現在、まだ存在していないプロパティのコードの呼び出しをサポートしていません(したがって、Mongooseはgoo
のセットの邪魔をすることができません たとえば、プロパティ)。
したがって、プロパティを設定する場合:
foo.goo = { c: 1 };
マングースは関与していません。 console.log
の場合 表示したコード以外のものでしたが、正しく報告されない可能性があります。
さらに、send
するとき 結果はJSON、JSON.stringify
として返されます toString
を呼び出すが呼び出されています マングースモデルで。その場合、Mongooseはスキーマで定義されたプロパティのみを使用します。したがって、デフォルトでは、追加のプロパティは返送されません。 data
の性質を変更しました ただし、配列はマングースデータを直接指すため、その問題を回避します。
通常の動作の詳細
プロパティgoo
を設定する場合 マングースを使用すると、かなりのことが起こります。 Mongooseは、Object.defineProperty
を介してプロパティゲッター/セッターを作成します (一部の docs
)。したがって、goo
を設定すると [String]
として定義したプロパティ 、いくつかのことが起こります:
- マングースコードは、値がオブジェクトインスタンスに設定される前に呼び出されます(単純なJavaScriptオブジェクトとは異なります)
- Mongooseは、データを格納するための配列(オプションで)を作成します(
MongooseArray
)これには配列データが含まれます。提供した例では、配列を渡さなかったため、配列が作成されます。 - Mongooseはデータを適切なタイプにキャストしようとします
-
toString
を呼び出します キャストの一部として渡されたデータについて。
したがって、結果として、ドキュメントにはtoString
を含む配列が含まれるようになります。 渡したオブジェクトのバージョン。
goo
の内容を確認した場合 プロパティを使用すると、[object Object]
を含む文字列である単一の要素を持つ配列になっていることがわかります。 。より基本的なタイプを選択した場合、または宛先プロパティのストレージタイプと一致した場合は、基本的な同等性チェックが機能したことがわかります。