метод сохранения в mongodb / mongoose - PullRequest
0 голосов
/ 01 апреля 2020

Это мой первый вопрос здесь. Я пытался сохранить документ в своей коллекции, но он не работает. Реакция функции точно такая, как я хочу, но она не сохраняется в моей БД. В другом контроллере (createRoom) foundUser.save () работает, но в этом контроллере нет. Заранее спасибо!

Я использую mongodb / mongooose и express.

const removeRoom = async (req,res,next) => {
   const {roomId, userData} = req.body;
   const { userId, token } = userData;
   
   let foundUser;
   let updatedRooms;
   let indexOfNamespaces;

   try {
      foundUser = await User.findById(userId)
      foundUser.namespaces.forEach((ns,i1)=>{
         updatedRooms = ns.rooms.filter((room,i2) => {
         if(room.id === roomId){
            indexOfNamespaces = i1;
         }
         return room.id !== roomId
      })

   })   
   foundUser.namespaces[indexOfNamespaces].rooms = updatedRooms;
   console.log(foundUser);

   await foundUser.save();
      
   } catch (err) {
      console.log(err);
      
      const error = new HttpError('Sth went wrong [removeRoom]', 500);
      return next(error);
   }
   res.status(201).json({updatedNamespaces: foundUser.namespaces});

}

1 Ответ

1 голос
/ 01 апреля 2020

Пн goose выполняет некоторые оптимизации, при которых оно действительно сохраняет поле, только если оно "изменяется". В этом случае вы модифицируете массив, но массив по-прежнему является «тем же» массивом, поскольку в нем все еще === (равно) предыдущему массиву. Вам нужно использовать новый массив для замены пространств имен.

Например:

foundUser.namespaces = [
  ...foundUser.namespaces.slice(0, indexOfNamespaces), 
  { ...foundUser.namespaces[indexOfNamespaces], rooms: updatedRooms }, 
  ...foundUser.namespaces.slice(indexOfNamespaces + 1)
]

Теперь при сохранении Mon goose увидит «новый» массив, который !== ( не равно) предыдущий массив, потому что это новый экземпляр, и он сохранит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...