как я могу найти одну запись с фильтром _id и обновить эту запись, используя nodejs и mongodb, mongoose - PullRequest
1 голос
/ 07 мая 2020

Я пытался обновить запись студента до mon go db, используя nodejs. Я использовал метод find One And Update, мой фильтр - studentId, student - мой экземпляр схемы, у которого есть do c для обновления. Я попробовал приведенный ниже код, но получил ошибку, так как typeerror student.findOneAndUpdate не является функцией.

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')
    var studentId = student._id;
    var filter = { _id: studentId };
    student.findOneAndUpdate(filter,(err,student)=> {
       if(!err){
        console.log('insertion to db sucess')  
       }
       else{
          console.log('insertion failed '+err);
       }
    })
}

1 Ответ

1 голос
/ 07 мая 2020

Проблема с вашим кодом заключается в том, что вы пытаетесь объединить две разные функции, указанные в 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.

...