Javascript 给定此模型,如何使用updateOne(mongoose)删除嵌套数组项?
我试图用“updateOne”方法删除一个数组项,但我的查询与我拥有的模型结构中的正确记录不匹配。给定一封电子邮件,我想找到包含所提供电子邮件的数组项,并将其拉出、删除。(没有具有相同电子邮件的数组项) 我的模型是这样的: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
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因为查询似乎用于顶级文档,所以在本例中它必须为空。我想你可以在答案中的文档中找到更多关于这方面的信息。