我使用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}, ...
你的代码有几个问题——正如其他人所说:
upsert: true
的使用是可疑的-我无法想象当你想要破坏这个,和- 缺少
$set
也是不寻常的,除非patientObj
代表您希望设置的整个文档
这两项都给你带来了问题,但我怀疑你的主要问题实际上是你的ID与任何内容都不匹配。
你提到一个自动生成的ID。Mongo使用ObjectId
(尽管mongoose可能没有)-取决于你如何序列化这个值,它的字符串表示可能看起来像这样:63b310df2b36d95e156a237d
-但是当你查询这个值时(就像你对userId
所做的那样)-它将返回不匹配,因为你需要将它转换为对象ID:
userId = new mongoose.types.ObjectId(req.body.userId)
你还应该修正上面的第1项和第2项。