В настоящее время я разрабатываю приложение Pokemon Team Builder с интерфейсом React и сервером Express с MongoDB для базы данных.

Насколько я могу судить, в моей TeamSchema нет таких атомарных операторов? Вот моя TeamSchema:

const mongoose = require('mongoose');

const TeamSchema = new mongoose.Schema({
  name: {
    type: 'String',
    required: true,
    unique: true,
  },
  team: [
    {
      name: { type: String },
      types: [{ type: String }],
      sprite: { type: String },
    },
  ],
  username: {
    type: String,
    required: true,
  },
  userId: {
    type: String,
    required: true,
  },
});

const TeamModel = mongoose.model('Team', TeamSchema);

module.exports = TeamModel;

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

const replaceTeam = async (req, res) => {
  const { teamName: name, filteredTeam: team } = req.body;
  const { username, _id: userId } = req.user;
  const newTeam = new Team({ name, team, username, userId });

  try {
    const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam);
    console.log(replacedTeam);
    res.status(200).json({ message: 'Team was successfully overwritten!' });
  } catch (err) {
    console.log(err);
    res.status(500).json({ message: 'An error occurred while updating the team.' });
  }
};

Это был настоящий скетч здесь, и я не уверен, что здесь не так. Я начал использовать мангуста только пару недель назад, поэтому мне интересно, не что-то фундаментальное, что я здесь неправильно понимаю.

0
Alex 4 Май 2021 в 02:29

2 ответа

Лучший ответ

Функция Mongoose findOneAndReplace ожидает переданный объект документа. См. Код ниже.

details.findOneAndReplace(
  { location: "New York" },
  { name: "Sunny", age: 292, location: "Detroit" },
  function(err, result) {
    if (err) {
      res.send(err);
    } else {
      res.send(result);
    }
  }
);

+ Изменить

const newTeam = new Team({ name, team, username, userId })

К

const newTeam = {name, team, username, userId}

Также, как и в коде другого постера, добавьте к вызову параметр new: true следующим образом, изменив

const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam);

К

const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam, { new: true });

В противном случае исходный документ будет возвращен в replacedTeam

1
Will Walsh 4 Май 2021 в 00:56

Вы можете просто использовать findOneAndUpdate и обновить все поля новыми данными. Сделать это можно так:

const replaceTeam = async (req, res) => {
  const { teamName: name, filteredTeam: team } = req.body;
  const { username, _id: userId } = req.user;
  try {
    const replacedTeam = await Team.findOneAndUpdate({ name, userId }, { name, team, username, userId }, {new: true});
    console.log(replacedTeam);
    res.status(200).json({ message: 'Team was successfully overwritten!' });
  } catch (err) {
    console.log(err);
    res.status(500).json({ message: 'An error occurred while updating the team.' });
  }
};
0
Nenad Milosavljevic 4 Май 2021 в 00:12