findByIdAndUpdate向数据库添加另一个文档而不是更新



我使用MEAN堆栈进行患者CRUD操作。这个更新似乎不能正常工作。它将另一个文档添加到数据库中,其中包含更新的信息,但带有空id,并保留应该更新的旧文档。下面是我在update patient

服务中编写的代码
editPatient(id:string,patient: Patient){
const headers = { 'content-type': 'application/json'}  
const body=patient;
console.log(body)

let url=environment.PATIENT_BASE_URL+environment.PATIENT.UPDATE_PATIENT + "?userId=" +id;
return this.httpClient.put(url, body);
}

这些是环境文件

的内容。
export const environment = {
production: false,
BASE_URL:'http://localhost:3000',
PATIENT_BASE_URL:'http://localhost:3000/patients/',
PATIENT:{

GET_ALL_PATIENTS: 'list',
GET_PATIENT: 'view',
UPDATE_PATIENT: 'update',
DELETE_PATIENT: 'delete',
SEARCH_PATIENT: 'search',
ADD_PATIENT: 'add',



}
};

这是patients.js

中的代码
router.put('/update', function(req, res, next) {
const userId = req.body.userId;
let firstnameVal = req.body.firstName;
let lastnameVal = req.body.lastName;
let usernameVal = req.body.username;
let emailVal = req.body.email;
let birthDateVal = req.body.birthDate;
let genderVal = req.body.gender;

let patientObj = {
firstName: firstnameVal,
lastName: lastnameVal,
username: usernameVal,
email: emailVal,
birthDate : birthDateVal,
gender: genderVal
};
// patientsModel.update({'gender':'female'}, )
patientsModel.findByIdAndUpdate(userId, patientObj,{upsert: true, new: true} ,function(err, patientResponse){
if(err){
res.send({status:500, message: 'Unable to update the patient'});
}

else{
res.send({status:200, message: 'User updated successfully'  ,results: patientResponse});
}
});

});

因为你使用了这个选项

upsert: true

如果item with id未找到,则创建一个新文档

你可以在这里阅读文档

使用upsert选项,您可以使用findOneAndUpdate()作为find-and-upsert操作。upsert的行为类似于normalfindOneAndUpdate(),如果它找到匹配过滤器的文档。但是,如果没有文档匹配过滤器,MongoDB将通过组合插入一个如下所示进行过滤和更新。

findByIdAndUpdate的第二个参数是一个更新对象。如果它不包含任何更新操作符,则将其视为替换文档。

如果您的意图是替换整个文档,以便它包含的唯一字段是该函数中提供的字段,请将_id添加到对象:

let patientObj = {
_id: new  mongoose.types.ObjectId(userId),
firstName: firstnameVal,
...

如果目的是修改提供的字段,但保留任何其他字段,使用$set更新操作符,如

patientsModel.findByIdAndUpdate(userId, {"$set": patientObj}, ...

你的代码有几个问题——正如其他人所说:

  1. upsert: true的使用是可疑的-我无法想象当你想要破坏这个,和
  2. 缺少$set也是不寻常的,除非patientObj代表您希望设置的整个文档

这两项都给你带来了问题,但我怀疑你的主要问题实际上是你的ID与任何内容都不匹配。

你提到一个自动生成的ID。Mongo使用ObjectId(尽管mongoose可能没有)-取决于你如何序列化这个值,它的字符串表示可能看起来像这样:63b310df2b36d95e156a237d-但是当你查询这个值时(就像你对userId所做的那样)-它将返回不匹配,因为你需要将它转换为对象ID:

userId = new  mongoose.types.ObjectId(req.body.userId)

你还应该修正上面的第1项和第2项。

相关内容

  • 没有找到相关文章

最新更新