Tôi sẽ không viết theo cách này, nhưng tôi sẽ cho bạn biết tại sao mã của bạn không thành công.
Vấn đề là khối $ set của bạn
Bạn đang chọn đặt giá trị cụ thể cho đối tượng cập nhật được truyền vào. Nếu giá trị là undefined
bạn đang buộc mongo đặt điều đó thành null
.
Đây là vấn đề
ví dụ, trong DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
NẾU bạn vượt qua testToUpdate = { name: 'foo' }
bạn sẽ kết thúc với
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
vì bạn đang nhận được updatedValues.nickname
ngoài các đối số và đối số không được xác định
Những gì bạn muốn là
Test.update({ ... }, { $set: updatedValues }
được dịch sang
Test.update({ ... }, { $set: { name: 'foo' } }
Bạn không còn cung cấp khóa cho biệt hiệu, do đó không đặt biệt hiệu thành không xác định / null.
Tôi sẽ sử dụng một plugin mongoose và không phải lo lắng về việc chuyển các trường theo cách thủ công vào mô hình của bạn (xem github.com/autolotto/mongoose-model-update )
- Bạn có thể xác định các trường có thể cập nhật và sau đó bạn chỉ có thể thực hiện
model.update(req.body)
và đừng lo lắng về tất cả những điều này - Ngay cả khi bạn không muốn sử dụng plugin, bạn vẫn có thể thực hiện
Test.findByIdAndUpdate(id, { name, nickname }, callback)