48

我有一个猫鼬User模型:

var User = mongoose.model('Users',
    mongoose.Schema({
        username: 'string',
        password: 'string',
        rights: 'string'
    })
);

我想找到User模型的一个实例,修改它的属性,然后保存更改。这是我尝试过的(这是错误的!):

User.find({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});

查找、修改和保存User模型实例的语法是什么?

4

6 回答 6

120

回调的user参数是一个带有find. 在查询单个实例时使用findOne而不是。find

User.findOne({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
于 2013-01-07T16:11:21.003 回答
56

为什么不使用Model.update?毕竟你没有使用找到的用户来更新它的属性:

User.update({username: oldUsername}, {
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
   //handle it
})
于 2013-01-07T16:12:34.087 回答
8

findOne,修改字段并保存

User.findOne({username: oldUsername})
  .then(user => {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.markModified('username');
    user.markModified('password');
    user.markModified('rights');

    user.save(err => console.log(err));
});

findOneAndUpdate

User.findOneAndUpdate({username: oldUsername}, {$set: { username: newUser.username, user: newUser.password, user:newUser.rights;}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }
    console.log(doc);
});

另见updateOne

于 2019-06-20T04:52:33.180 回答
4

我想补充一些非常重要的东西。我经常使用 JohnnyHK 方法,但我注意到有时更改不会持续到数据库中。当我使用它时.markModified,它起作用了。

User.findOne({username: oldUsername}, function (err, user) {
   user.username = newUser.username;
   user.password = newUser.password;
   user.rights = newUser.rights;

   user.markModified(username)
   user.markModified(password)
   user.markModified(rights)
    user.save(function (err) {
    if(err) {
        console.error('ERROR!');
    }
});
});

在保存之前用 doc.markModified('pathToYourDate') 告诉猫鼬有关更改。

于 2018-07-22T01:33:57.100 回答
3

如果您想使用find,就像我想在客户端进行的任何验证一样。

find返回一个 ARRAY 对象

findOne只返回一个对象

添加user = user[0]使保存方法对我有用。

这是你放的地方。

User.find({username: oldUsername}, function (err, user) {
    user = user[0];
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
于 2015-05-08T08:41:25.240 回答
1

您还可以使用 updateOne 和 $set 以及 async/await 将其编写得更简洁一些。

const updateUser = async (newUser) => {
  try {
    await User.updateOne({ username: oldUsername }, {
      $set: {
        username: newUser.username,
        password: newUser.password,
        rights: newUser.rights
      }
    })
  } catch (err) {
    console.log(err)
  }
}

由于您不需要生成的文档,您可以只使用 updateOne 而不是 findOneAndUpdate。

这里有一个关于差异的很好的讨论:MongoDB 3.2 - Use cases for updateOne over findOneAndUpdate

于 2019-07-25T14:38:47.500 回答