我想通过使用之前找到的数组值来更新Mongoose中的一些数据。
Company.findById(id_company,function(err, company) {
if(err){
console.log(err);
return res.status(500).send({message: "Error, check the console. (Update Company)"});
}
const Students = company.students;
User.find({'_id':{"$in" : Students}},function(err, users) {
console.log(Students);
// WANTED QUERY : Update company = null from Users where _id = Students[];
});
});
学生以数组的形式返回users._id,对象内部是对象,然后用它来查找users对象,然后我想在users对象内将一个字段设置为null,该字段名为“ company”。我该怎么做?谢谢。
答案 0 :(得分:0)
从您发布的内容中(我可以自由使用Promises
,但可以通过回调大致实现相同的功能),您可以执行以下操作:
User.find({'_id':{"$in" : Students}})
.then( users =>{
return Promise.all( users.map( user => {
user.company = null;
return user.save()
}) );
})
.then( () => {
console.log("yay");
})
.catch( e => {
console.log("failed");
});
基本上,我在这里所做的是通过检查为.all()
返回的Promised值来确保.find()
调用返回的.save()
用户模型得到正确保存。
如果其中之一由于某些原因而失败,Promise.all()
会返回拒绝,您可以随后进行捕获。
但是,在这种情况下,每个项目都将映射到对您数据库不好的查询。更好的策略是使用Model.update(),这将在本质上减少数据库查询的情况下实现相同的目的。
User.update({
'_id': {"$in": Students}
}, {
'company': <Whatever you want>
})
.then()
答案 1 :(得分:0)
使用.update
,但请确保您通过选项{multi: true}
,例如:
User.update = function (query, {company: null}, {multi: true}, function(err, result ) { ... });