Подтвердить что ты не робот

Mongoose: найти, изменить, сохранить

У меня есть модель Mongoose 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?

4b9b3361

Ответ 1

Почему бы не использовать Model.update? В конце концов вы не используете найденного пользователя для чего-либо еще, кроме как обновить его свойства:

User.update({username: oldUsername}, {
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
   //handle it
})

Ответ 2

Параметр 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!');
        }
    });
});

Ответ 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!');
        }
    });
});

Ответ 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!');
    }
});
});

Перед сохранением сообщите mongoose об изменении с помощью doc.markModified('pathToYourDate').

Ответ 5

найти, изменить поля и сохранить

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

Ответ 6

Вы также можете написать это немного чище, используя 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 - Варианты использования для updateOne over findOneAndUpdate