Javascript 给定此模型,如何使用updateOne(mongoose)删除嵌套数组项?

Javascript 给定此模型,如何使用updateOne(mongoose)删除嵌套数组项?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图用“updateOne”方法删除一个数组项,但我的查询与我拥有的模型结构中的正确记录不匹配。给定一封电子邮件,我想找到包含所提供电子邮件的数组项,并将其拉出、删除。(没有具有相同电子邮件的数组项) 我的模型是这样的: var mongoose=require('mongoose'); var teamMemberModelSchema=新的mongoose.Schema({ _id:错, “电子邮件”:{ “类型”:字符串, “必需”:正确, “minlenght”:5, “最大高度”:5

我试图用“updateOne”方法删除一个数组项,但我的查询与我拥有的模型结构中的正确记录不匹配。给定一封电子邮件,我想找到包含所提供电子邮件的数组项,并将其拉出、删除。(没有具有相同电子邮件的数组项)

我的模型是这样的:

var mongoose=require('mongoose');
var teamMemberModelSchema=新的mongoose.Schema({
_id:错,
“电子邮件”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:5,
“最大高度”:50
},
“姓名”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:5,
“最大高度”:256
},
“作用”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:20,
“最大高度”:256
},
“推特”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:1,
“最大高度”:100
},
“facebook”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:1,
“最大高度”:100
},
“linkedin”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:1,
“最大高度”:100
},
});
var teamModelSchema=newmongoose.Schema({
“标题”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:5,
“最大高度”:20
},
“标题”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:5,
“最大高度”:30
},
“说明”:{
“类型”:字符串,
“必需”:正确,
“minlenght”:5,
“最大高度”:80
},
“成员”:[teamMemberModelSchema]
},{集合:'团队'});
teamModelSchema.set('collection','team');
mongoose.model('team',teamModelSchema)
我尝试的方法如下:

module.exports.removember=函数(req,res){
const email=req.params.email;
const query={“members.email”:email};
constpull={$pull:{“members.$.email”:email};
试一试{
var message=teamMsg.teammemberremovesucces;
TeamModel.updateOne(查询、拉取);
sendJSON(res,false,{message:message});
}捕捉(错误){
控制台日志(错误消息);
sendJSON(res,err,{message:err.message});
}
};
它执行时没有错误,但没有更新任何内容

我尝试了其他一些选项,如“FindOneAndUpdate”和“FindOneAndRemove”,但我找不到解决方案

有什么想法吗?

尝试使用
update()
方法和
async/await

module.exports.removeMember = async function (req, res) {

    const email = req.params.email;
    console.log(`email = ${email}`)   // Make sure correct value is coming thru

    const query = { "members.email": email };
    const pull = { $pull: { "members.$.email": email } };
    const options = { multi: true }

    try {

        var message = teamMsg.teamMemberRemoveSuccess;

        await TeamModel.update( query, pull, options );


        responseUtilities.sendJSON(res, false, { "message": message });

    } catch (err) {
        console.log(err.message);
        responseUtilities.sendJSON(res, err, { "message": err.message });
    }
};
请尝试此查询:

db.collection.update(
    { 'members.email': 'email@address' },
    { $pull: { members: { email: 'email@address' } } },
    { multi: true }
)

您可以将
findOneAndUpdate
$pull
运算符一起用于此任务

要从文档数组中删除项,可以检查MongoDb

您需要使用
等待
然后
块进行查询。我使用了wait,并通过添加
async
关键字使函数异步。我们还需要空的查询对象

我还添加了
new:true
选项,以返回更新的对象以检查项目是否已删除

您需要处理没有文档匹配的情况,我为您添加了一个TODO

module.exports.removember=异步函数(req,res){
const email=req.params.email;
常量查询={};
恒拉力={
$pull:{
成员:{
电邮:电邮
}
}
};
常量选项={
新:真的
};
试一试{
var message=teamMsg.teammemberremovesucces;
const result=wait TeamModel.updateOne(查询、拉取、选项);
控制台日志(结果);
如果(!结果){
//TODO:返回400错误请求或404-未找到
}否则{
sendJSON(res,false,{message:message});
}
}捕捉(错误){
控制台日志(错误消息);
sendJSON(res,err,{message:err.message});
}
};

您是否检查您的查询
{“members.email”:email}
是否返回了一些内容?是的,我返回了。但是没有任何内容被删除/更新。您是想在
{“members.email”:email}
的位置拉取整个成员对象,还是只想从成员对象中删除字段email?@whoami我想用提供的email而不仅仅是其email字段删除整个成员它工作正常!非常感谢你!为什么要清空查询对象?请你解释一下好吗?我尝试过同样的解决方案,但我把这个查询=>constquery={“members.email”:email}@OlavoAlexandrino因为查询似乎用于顶级文档,所以在本例中它必须为空。我想你可以在答案中的文档中找到更多关于这方面的信息。