Node.js Mongoose — модель в обновлении модели

#node.js #mongodb #mongoose #schema #endpoint

#node.js #mongodb #мангуст #схема #конечная точка

Вопрос:

У меня есть 1 модель для записей в блоге:

 const blogSchema= new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
  },
  name: {
    type: String,
    required: true,
    max: 50,
    min: 6,
  },
  description: {
    type: String,
    required: true,
    max: 1024,
    min: 25,
  },
  date: {
    type: Date,
    default: Date.now,
  },
  comment: [commentSchema],
});
  

Важной частью здесь является комментарий к последнему полю. Для этого у меня есть другая схема:

     const commentSchema = new mongoose.Schema({
      date: {
        type: Date,
        default: Date.now,
      },
      comment: {
        type: String,
        max: 1024,
        min: 5,
      },
      userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
      },
    });
  

Обычно, когда создается сообщение, комментарии могут быть добавлены. В отдельном файле User.js У меня есть модель для пользователя:

 const userSchema = new mongoose.Schema({
  name: {
    type: String,
    unique: true,
    required: true,
    max: 255,
    min: 6,
  },
  email: {
    type: String,
    unique: true,
    required: true,
  },

  password: {
    type: String,
    required: true,
    min: 6,
  },
  date: {
    type: Date,
    default: Date.now,
  },
});
  

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

Итак, есть идеи, как я могу создать:

  1. Конечная точка, которая будет хранить комментарии в поле комментариев blogSchema
  2. Пользователь будет записан в commentSchema

Ответ №1:

Для модели blogPosts вам необходимо сохранить массив комментариев в качестве ссылки на комментарий, используя идентификатор объекта типа и ссылку:»комментарий»

 comment: [{
type: mongoose.Schema.Types.ObjectId,
ref: "commentSchema",
}]
  

Теперь, когда комментарий добавляется к сообщению, добавьте идентификатор документа комментария в blogpost-> массив комментариев.
Чтобы получить комментарии к записи в блоге, используйте агрегацию или заполните комментарии, связанные с записью в блоге.

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

1. Как добавить идентификатор документа комментария в массив BlogPost.comment?

2. Есть 2 способа сделать это. 1) Создайте комментарий и сохраните его в базе данных, теперь используйте идентификатор этого документа и отправьте его в BlogPost.comment. 2) Создайте пользовательский идентификатор объекта с помощью функции ObjectId и сохраните идентификатор в blogpost.comment, а также создайте комментарий с тем же идентификатором. Первый метод более рекомендуется

3. Я сделал это, сначала создав комментарий, сохранив его, а затем сохранив в блоге с помощью findOneAndUpdate:

4. const newComment = новый комментарий ({ комментарий, идентификатор пользователя: req.user. _id }); ожидание поступления.сохранить(); постоянное обновление = { $push: { комментарий: поступление, }, }; постоянное сообщение = ожидание BlogPost.findOneAndUpdate( { _id: req.params.post }, обновление );

Ответ №2:

То, как я это сделал:

Модель отдельного комментария в другом файле:

   const mongoose = require("mongoose");
    
    const commentSchema = new mongoose.Schema({
      date: {
        type: Date,
        default: Date.now,
      },
      comment: {
        type: String,
        max: 1024,
        min: 5,
      },
      userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
      },
    });
    
    module.exports = mongoose.model("Comment", commentSchema);
  

Измените поле комментария, как предложил Мохит Гупта в своем ответе:

 const mongoose = require("mongoose");

const blogSchema = new mongoose.Schema({
  //OTHER FIELDS ARE HERE.....
  comment: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Comment",
    },
  ],
});

module.exports = mongoose.model("Blog", blogSchema);
  

Затем я сделал маршрут следующим образом:

 //COMMENT
router.post("/comment/:post", verify, async (req, res) => {

  const { comment } = req.body;
  if (!comment) {
    return res
      .status(422)
      .send({ error: "Must provide comment with at least 5 symbols" });
  }

  try {
    const newComment = new Comment({ comment, userId: req.user._id });
    await newComment.save();
    const update = {
      $push: {
        comment: newComment,
      },
    };
    const post= await Blog.findOneAndUpdate(
      { _id: req.params.post },
      update
    );

    res.send(post);
  } catch (err) {
    res.status(422).send({ error: err.message });
  }
});