Проблема с вашим кодом заключается в том, что вы пытаетесь объединить две разные функции, указанные в Mon goose .save () , который работает с экземплярами модели mon goose, т.е. documents & .findOneAndUpdate () , который работает непосредственно с моделями mon goose.
Итак, если у вас есть все фильтры и изменения, вы бы напрямую использовали функцию .findOneAndUpdate()
на mon goose модель для обновления существующего документа:
let student = {
_id: mongoose.Types.ObjectId(_eId),
name: name,
studentId: id,
status: status,
};
updateToDb(student);
/** passing in .Js Object as input */
function updateToDb(studentInput) {
console.log(studentInput._id + " studentId");
var studentId = studentInput._id;
var filter = { _id: studentId };
delete studentInput._id; // Deleting `_id` from studentInput as it shouldn't be there in update object
Student.findOneAndUpdate(filter, studentInput, (err, student) => {
if (!err) {
console.log("insertion to db sucess");
} else {
console.log("insertion failed " + err);
}
});
}
Итак, с .findOneAndUpdate()
мы передадим опцию { multi : true }
для вставки нового документа, если ни один документ не соответствует фильтру. Но с .save()
мы можем фактически использовать его для новой вставки и обновлений, если _id
существует во входном запросе и документ в БД совпадает с ним, тогда .save()
будет считаться операцией обновления, иначе он будет рассматриваться как вставка операция, но она не работает на моделях mon goose, она будет работать только на экземплярах моделей mon goose.
/** Here since you're passing in instance of mongoose model then use .save() */
var student = new Student();
student._id = mongoose.Types.ObjectId(_eId);
student.name = name;
student.studentId = id;
student.status = status;
updateToDb(student);
function updateToDb(student) {
console.log(student._id + " studentId");
student.save((err, student) => {
if (!err) {
console.log("insertion to db sucess");
} else {
console.log("insertion failed " + err);
}
});
В идеале .save()
используется для обновлений, когда вы впервые читаете документ из БД, а затем внесите необходимые изменения, так как mon goose отслеживает изменения, происходящие в документе, в конце все, что вам нужно сделать, это применить .save()
к этому do c.