Saya tidak akan menulis seperti ini, tetapi saya akan memberi tahu Anda mengapa kode Anda gagal.
Masalahnya adalah blok $set Anda
Anda memilih untuk secara khusus menyetel nilai ke objek pembaruan yang diteruskan. Jika nilainya undefined
Anda memaksa mongo untuk menyetelnya ke null
.
Inilah masalahnya
contoh, dalam DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
JIKA Anda lulus testToUpdate = { name: 'foo' }
Anda akan berakhir dengan
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
karena Anda mendapatkan updatedValues.nickname
dari argumen dan itu tidak ditentukan
Apa yang Anda inginkan adalah
Test.update({ ... }, { $set: updatedValues }
yang diterjemahkan menjadi
Test.update({ ... }, { $set: { name: 'foo' } }
Anda tidak lagi memberikan kunci untuk nama panggilan, sehingga tidak membuatnya disetel ke undefined/null.
Saya akan menggunakan plugin luwak dan tidak khawatir tentang meneruskan bidang secara manual sampai ke model Anda (lihat github.com/autolotto/mongoose-model-update )
- Anda dapat menentukan bidang yang dapat diperbarui dan kemudian Anda cukup melakukan
model.update(req.body)
dan jangan khawatir tentang semua ini - Bahkan jika Anda tidak ingin menggunakan plugin, Anda tetap dapat melakukan
Test.findByIdAndUpdate(id, { name, nickname }, callback)