#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 пользователь мог комментировать сообщение другого пользователя, и его имя отображалось под ним.
Итак, есть идеи, как я могу создать:
- Конечная точка, которая будет хранить комментарии в поле комментариев blogSchema
- Пользователь будет записан в 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 });
}
});