如何基于猫鼬中的数组值更新一些数据?

时间:2018-06-19 13:40:58

标签: node.js express mongoose

我想通过使用之前找到的数组值来更新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”。我该怎么做?谢谢。

2 个答案:

答案 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 ) { ... });