проблемы с обновлением коллекции mongodb

#javascript #mongodb #express #mongoose #updates

#javascript #mongodb #экспресс #мангуст #Обновления

Вопрос:

итак, у меня есть две разные коллекции для моего приложения для социальных сетей. Один для пользователей, а другой для сообщений пользователя. Всякий раз, когда я обновляю информацию из коллекции одного из моих пользователей, она также должна изменять ее в сообщении (поскольку моя коллекция сообщений также включает данные от пользователя), но это делается только для сообщений, которые я создаю после этого, а не для тех, которые я создавал раньше. Как я могу это исправить?

СХЕМА ПОЛЬЗОВАТЕЛЯ

 const userSchema = new Schema({
    name: { type: String, required: true },
    lastname: { type: String, required: true },
    username: { type: String, required: true },
    email: { type: String, required: true },
    password: { type: String, required: true, minlength: 8 },
    avatar: { data: Buffer, contentType: String },
});
  

ОПУБЛИКОВАТЬ СХЕМУ

 const postSchema = new Schema({
   user: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
   name: { type: String, required: true },
   lastname: { type: String },
   username: { type: String },
   avatar: { data: Buffer, contentType: String },
   date: { type: Date, default: Date.now() },
   textOfThePost: { type: String, required: true },
});
  

РЕДАКТИРОВАТЬ ФУНКЦИЮ EXPRESS / MONGOOSE

 router.put("/edit_profile", async (req, res) => {
  try {
    const { name, lastname, username } = req.body;
    const user = await User.findById(req.user).select("-password");

     if (!user) return res.status(404).json("User doesn't exists");

     if (name) user.name = name;
     if (lastname) user.lastname = lastname;
     if (username) user.username = username;

     await user.save();
     res.json(user);
  } catch (err) {
     res.status(500).json({ error: err.message });
 }
 };
  

Комментарии:

1. Вам придется обновлять все старые документы вручную, это не происходит автоматически. Однако на самом деле ничего этого делать не нужно; включение любых пользовательских данных в документ Post, кроме идентификатора пользователя, в любом случае является полностью избыточным. Все, что вам нужно сделать, это заполнить поле user после получения сообщений из базы данных.

2. Но post модель заполняет user _id (как и должно быть); как возможно, что только вновь созданные сообщения заполняют пользователя новыми данными, а более старые сообщения — более старыми пользовательскими данными? Все они заполняются из одного и того же документа в одной коллекции

Ответ №1:

Вы можете использовать updateMany() для этой цели.

 const res = await Post.updateMany({ user: user.id  }, { name: user.name, username: user.username /* ... */  });
  

Однако, как уже указывалось, вы сохраняете пользовательские данные, избыточные как в модели post, так и в модели user, что необязательно. Подобно объединениям в SQL, вы можете просто использовать populate() и не хранить какие-либо пользовательские данные в своей модели post. Таким образом, каждый раз, когда вы запрашиваете свои сообщения, он автоматически извлекает последнюю соответствующую пользовательскую модель по ее идентификатору.

 myPost.populate('user')
  

Обратите внимание, что поэтому ref требуется, который сообщает mongoose, как заполнить поле пользователя.