Обновление имени пользователя профиля в пн goose, а затем обновление имени пользователя и данных в их сообщениях и комментариях - PullRequest
0 голосов
/ 27 мая 2020

Итак, я создаю приложение для социальных сетей для своего последнего проекта с учебным курсом по программированию. Мы используем MongoDB / Mon goose на бэкэнде, и у меня возникают проблемы с попыткой обновить данные пользователя, когда они меняют свое имя пользователя и имя / фамилию. Их профиль обновляется, их имена в сообщениях обновляются, но их комментарии к сообщениям других людей не обновляются.

Макет на понедельник goose такой ...

Есть коллекция профилей пользователей. Каждая коллекция пользователей имеет коллекции сообщений, если они существуют. У каждого сообщения есть коллекция комментариев, если они существуют.

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

Вот пример кода ...

Контроллер:

update: function (req, res) {
    db.User.findOneAndUpdate({ _id: req.params.id }, req.body, {
      new: true,
    })
      .then(function (dbUser) {
        //Updates posts from the user specified in params
        //with new pic.
        return db.Post.update(
          { _id: { $in: dbUser.posts } },
          {
            username: req.body.slug,
            firstName: req.body.firstName,
            lastName: req.body.lastName,
          },
          { multi: true }
        );
      })
      .then(function (req) {
        db.Comment.update(
          { userId: req.body.userId },
          {
            $set: {
              username: req.body.slug,
              firstName: req.body.firstName,
              lastName: req.body.lastName,
            },
          },
          { multi: true }
        );
      })
      .then(dbModel => res.json(dbModel))
      .catch(err => res.status(422).json(err));

Модели (упрощенные):

const userSchema = new Schema({
  username: { type: String, required: true },
  //username in lowercase
  slug: { type: String, required: true },
  firstName: { type: String, required: true },
  lastName: { type: String, required: true },
  posts: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Post',
    },
  ],
  notifications: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Notification',
    },
  ],
})
const postSchema = new Schema({
  userId: { type: String, required: true },
  username: { type: String, required: true },
  firstName: { type: String, required: true },
  lastName: String,
  postBody: { type: String, required: true },
  createdAt: { type: Date, default: Date.now },
  comments: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Comment',
    },
  ],

});
const commentSchema = new Schema({
  postId: { type: String, required: true },
  username: { type: String, required: true },
  commentBody: { type: String, required: true },
  createdAt: { type: Date, default: Date.now },
  firstName: { type: String, required: true },
  lastName: String,
  userId: { type: String, required: true },
  originalPoster: { type: String, required: true },
});

Я считаю, что данные отправляются правильно из внешнего интерфейса, потому что сообщения пользователей обновляются правильно , это просто комментарии в сообщениях, которых нет. Поскольку комментарии представляют собой отдельную коллекцию, я хотел бы написать функцию, которая просматривает каждый комментарий, и если userId = req.body.userId, обновите firstName, lastNa

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Разобрался FYI. Я думаю, что приход сюда и написание моей проблемы помогло.

db.Comment.find({ userId: req.params.id })
      .then(function (dbComment) {
        return db.Comment.updateMany(
          { userId: req.params.id },
          {
            $set: {
              username: req.body.slug,
              firstName: req.body.firstName,
              lastName: req.body.lastName,
            },
          },
          { multi: true }
        );
      })
0 голосов
/ 27 мая 2020

Вместо хранения полей «userId», «username», «firstName» и «lastName» вы можете просто сохранить ссылку на пользователя. Таким образом, вам даже не нужно будет сканировать Коллекцию для обновления (это относится как к сообщениям, так и к комментариям), это будет просто связано с пользовательским документом. У вас уже есть отношения, встроенные в вашу схему, так что это просто вопрос применения того же logi c к пользователю!

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