Javascript findOneAndUpdate(mongoose)在更新模型中的嵌套文档时返回true,但不更新任何内容

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

是的,我知道还有非常类似的其他问题,我正在研究它们,但不幸的是,我找不到解决办法。因此,我试图用“findOneAndUpdate”方法更新mongoose模型中的嵌套文档,但即使它返回了一个文档,这个文档仍然是原始文档,而不是更新的文档

模型如下:

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