Мангуста обновление МОДЕЛИ () против сохранения () - PullRequest
0 голосов
/ 22 марта 2019

Был вопрос о update() против save(), но он был нацелен на некоторые другие вещи (я думаю, чисто связанные mongoose.Schema методы, но не на настоящий документ)

У меня есть следующий сценарий, когда пользователь входит на сайт:

  • Мне нужно загрузить документ (найдите его по userModel.email)
  • Проверьте, соответствует ли хэш userModel.password тому, что было получено
  • Обновление userModel.lastLogin отметка времени
  • Добавить событие авторизации к userModel.myEvents[] массиву

Так что мне интересно - Как правильно идти?

1)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
foundUser.lastLogin = new Date();
foundUser.myEvents.push(authEvent)
foundUser.save();

2)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
foundUser.update({
    $push: { myEvents: authEvent },
    $set: { lastLogin: new Date() }
});
foundUser.save();

3)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
userModel.updateOne({_id: foundUser._id}, {$push: ...
// seems no save is required here?

4) * * тысяча тридцать-семь

// I am doing it wrong, and you have faster/higher/stronger variant?

1 Ответ

1 голос
/ 22 марта 2019

Прежде всего, вам не нужно вызывать foundUser.save (), когда вы используете метод foundUser.update ().

И все вышеперечисленные методы почти одинаково эффективны, так как есть двазвонки в базу данных.Итак, все сводится к вашим личным предпочтениям.

И еще один метод с одним вызовом базы данных может быть выполнен следующим образом: -

let foundUser = await userModel.findOneAndUpdate(
 { email: recievedEmail, password: hashedPassword },
 { $set: { lastLogin: new Date() }, $push: { myEvents: authEvent } }
);

В этом методе, если существует пользователь с указанным адресом электронной почты и паролем, этотПользователь будет обновлен и соответствующий обновленный документ будет возвращен в переменной foundUser.Поэтому вам не нужно выполнять дополнительную проверку пароля: если findOneAndUpdate() возвращает документ, это означает, что пароль и адрес электронной почты совпадают.Вам просто нужно проверить, нет ли в возвращаемом документе нулевого или неопределенного соответствия.

...