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
-
errlà lỗi nếu có xảy ra -
rawlà 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.