Javascript findOneAndUpdate(mongoose)在更新模型中的嵌套文档时返回true,但不更新任何内容
是的,我知道还有非常类似的其他问题,我正在研究它们,但不幸的是,我找不到解决办法。因此,我试图用“findOneAndUpdate”方法更新mongoose模型中的嵌套文档,但即使它返回了一个文档,这个文档仍然是原始文档,而不是更新的文档 模型如下:Javascript findOneAndUpdate(mongoose)在更新模型中的嵌套文档时返回true,但不更新任何内容,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,是的,我知道还有非常类似的其他问题,我正在研究它们,但不幸的是,我找不到解决办法。因此,我试图用“findOneAndUpdate”方法更新mongoose模型中的嵌套文档,但即使它返回了一个文档,这个文档仍然是原始文档,而不是更新的文档 模型如下: var mongoose = require('mongoose'); var teamMemberModelSchema = new mongoose.Schema({ "_id": mongoose.SchemaTypes.Objec
var mongoose = require('mongoose');
var teamMemberModelSchema = new mongoose.Schema({
"_id": mongoose.SchemaTypes.ObjectId,
"email": {
"type": String,
"required": true,
"min": 5,
"max": 20
},
"name": {
"type": String,
"required": true,
"min": 5,
"max": 20
},
"role": {
"type": String,
"required": true,
"min": 20,
"max": 50
},
"twitter": {
"type": String,
"required": true,
"min": 20,
"max": 50
},
"facebook": {
"type": String,
"required": true,
"min": 20,
"max": 50
},
"linkedin": {
"type": String,
"required": true,
"min": 20,
"max": 50
},
});
var teamModelSchema = new mongoose.Schema({
"title": {
"type": String,
"required": true,
"min": 5,
"max": 20
},
"headline": {
"type": String,
"required": true,
"min": 5,
"max": 30
},
"description": {
"type": String,
"required": true,
"min": 5,
"max": 80
},
"members": [teamMemberModelSchema]
}, { collection: 'team' });
teamModelSchema.set('collection', 'team');
mongoose.model('team', teamModelSchema);
我想用以下代码段更新成员嵌套文档:
module.exports.teamMemberUpdate = function (req, res) {
var email = req.body.email;
var name = req.body.name;
var role = req.body.role;
var twitter = req.body.twitter;
var facebook = req.body.facebook;
var linkedin = req.body.linkedin;
teamFunctions.findTeamMember(email)
.then(data => {
if (data.length === 0) {
responseUtilities.sendJSON(res, false, { "message": teamMsg.teamMemberNotFound });
}
else {
return data[0];
}
})
.then(() => {
const query = { "members.email": email };
const options = { new: true };
var update = {
$set: {
email: email,
name: name,
role: role,
twitter: twitter,
facebook: facebook,
linkedin: linkedin
}
};
TeamModel.findOneAndUpdate(query, update, options, function (err, result) {
var message = teamMsg.teamMemberUpdatedSuccess;
if (!result) {
message = teamMsg.teamMemberUpdatedError;
}
responseUtilities.sendJSON(res, err, { "message": message });
});
})
.catch(err => {
console.log(err.message);
responseUtilities.sendJSON(res, err, { "message": err.message });
});
}
显示“teamMemberUpdatedSuccess”值,但实际上,原始文档未更新
有人能找出问题所在吗?
TeamModel
没有任何名为email
、name
等的属性(请参阅更新变量)。您的更新查询应如下所示:
const update = {
$set: {
'members.$.email': email
}
};
$
非常重要,因为成员是一个数组
希望有帮助。您可以使用带点符号的位置$operator。是针对您的场景的文档
您可以使用以下功能使用给定电子邮件更新成员。如您所见,我们只有一个db访问权限。不需要使用teamFunctions.findTeamMember
函数
我使用了一些现代javascript特性,比如和语法来编写干净的代码
module.exports.teamMemberUpdate=异步函数(req,res){
const{email,name,role,twitter,facebook,linkedin}=req.body;
常量查询={
“成员.电子邮件”:电子邮件
};
const options={new:true};
常数更新={
$set:{
“成员.$.email”:电子邮件,
“成员.$.name”:名称,
“成员.$.role”:角色,
“成员.$.twitter”:twitter,
“成员.$.facebook”:facebook,
“会员.$.linkedin”:linkedin
}
};
试一试{
const result=await TeamModel.findOneAndUpdate(查询、更新、选项);
如果(!结果){
返回res.status(400)。发送(“未找到该电子邮件的成员”);
}
res.send(结果);
}捕捉(错误){
控制台日志(err);
res.status(500)。发送(“出错”);
}
};
请先试用此功能,不要更改任何内容,在您看到它工作后,您可以进行特定于应用程序的更改
我还注意到模式定义中的一个小问题,您应该为字符串类型使用minlenght
和maxlength
选项,而不是min
和max