Bạn không thể sử dụng cả $set
và $push
trong cùng một biểu thức cập nhật như các toán tử lồng nhau.
Cú pháp chính xác để sử dụng các toán tử cập nhật như sau:
{
<operator1>: { <field1>: <value1>, ... },
<operator2>: { <field2>: <value2>, ... },
...
}
nơi <operator1>, <operator2>
có thể từ bất kỳ danh sách toán tử cập nhật nào được chỉ định tại đây.
Để thêm một phần tử mới vào mảng, một $push
toán tử sẽ đủ, ví dụ:bạn có thể sử dụng findByIdAndUpdate
cập nhật phương thức để trả lại tài liệu đã sửa đổi dưới dạng
Employeehierarchy.findByIdAndUpdate(employeeparent._id,
{ "$push": { "childrens": employee._id } },
{ "new": true, "upsert": true },
function (err, managerparent) {
if (err) throw err;
console.log(managerparent);
}
);
Sử dụng update()
ban đầu của bạn phương thức, cú pháp là
Employeehierarchy.update(
{ "_id": employeeparent._id},
{ "$push": { "childrens": employee._id } },
function (err, raw) {
if (err) return handleError(err);
console.log('The raw response from Mongo was ', raw);
}
);
trong đó hàm gọi lại nhận các đối số (err, raw)
ở đâu
-
err
là lỗi nếu có xảy ra -
raw
là câu trả lời đầy đủ từ Mongo
Vì bạn muốn kiểm tra tài liệu đã sửa đổi, tôi khuyên bạn nên sử dụng findByIdAndUpdate
kể từ khi update()
phương thức sẽ không cung cấp cho bạn tài liệu đã sửa đổi, chỉ là kết quả ghi đầy đủ từ mongo.
Nếu bạn muốn cập nhật một trường trong tài liệu và thêm một phần tử vào một mảng cùng một lúc thì bạn có thể thực hiện
Employeehierarchy.findByIdAndUpdate(employeeparent._id,
{
"$set": { "name": "foo" },
"$push": { "childrens": employee._id }
}
{ "new": true, "upsert": true },
function (err, managerparent) {
if (err) throw err;
console.log(managerparent);
}
);
Ở trên sẽ cập nhật name
trường thành "foo" và thêm id nhân viên vào childrens
mảng.