Perbarui
Mungkin saya salah memahami pertanyaan awal Anda, tetapi sekarang sepertinya sifat pertanyaan Anda berubah, jadi informasi di bawah ini tidak relevan, tetapi saya biarkan saja. :)
Saya menguji kode Anda dan berfungsi dengan baik untuk saya. Mongoose tidak mengeksekusi kode khusus apa pun saat Anda menyetel properti yang bukan bagian dari skema (atau beberapa properti khusus lainnya). JavaScript saat ini tidak mendukung kode panggilan untuk properti yang belum ada (sehingga Mongoose tidak dapat menghalangi kumpulan goo
properti misalnya).
Jadi, ketika Anda mengatur properti:
foo.goo = { c: 1 };
Mongoose tidak terlibat. Jika console.log
Anda adalah sesuatu selain kode yang Anda tampilkan, saya dapat melihat bahwa itu mungkin salah melaporkan.
Selain itu, saat Anda send
hasilnya kembali sebagai JSON, JSON.stringify
sedang dipanggil, yang memanggil toString
pada Model Mongoose Anda. Ketika itu terjadi, Mongoose hanya menggunakan properti yang ditentukan pada skema. Jadi, tidak ada properti tambahan yang dikirim kembali secara default. Anda telah mengubah sifat data
array meskipun untuk langsung menunjuk pada data Mongoose, sehingga menghindari masalah itu.
Detail tentang perilaku normal
Saat Anda menyetel properti goo
menggunakan Mongoose, beberapa hal terjadi. Luwak membuat pengambil/penyetel properti melalui Object.defineProperty
(beberapa dokumen
). Jadi, ketika Anda mengatur goo
properti, yang telah Anda definisikan sebagai [String]
, beberapa hal terjadi:
- Kode luwak dipanggil sebelum nilai disetel ke instance objek (tidak seperti objek JavaScript sederhana)
- Mongoose membuat larik (opsional) untuk menyimpan data (
MongooseArray
) yang akan berisi data array. Dalam contoh yang Anda berikan, karena Anda tidak melewatkan array, array akan dibuat. - Luwak akan mencoba memasukkan data Anda ke jenis yang tepat
- Ini akan memanggil
toString
pada data yang dikirimkan sebagai bagian dari pemeran.
Jadi, hasilnya adalah dokumen sekarang berisi array dengan toString
versi objek yang Anda lewati.
Jika Anda memeriksa isi goo
properti, Anda akan melihat bahwa itu sekarang array dengan elemen tunggal, yang merupakan string yang berisi [object Object]
. Jika Anda memilih tipe yang lebih mendasar atau cocok dengan tipe penyimpanan properti tujuan, Anda akan melihat bahwa pemeriksaan kesetaraan dasar akan berhasil.