#javascript #node.js #mongodb #express #mongoose
Вопрос:
Я создаю приложение для блога, используя node.js и реагировать. Я использую MongoDB и хотел бы использовать метод Мангуста .populate
для извлечения данных из коллекций. На данный момент у меня есть три коллекции: Post
, User
и Category
коллекции. Я смог использовать этот .populate()
метод, чтобы перейти username
от User Schema
модели и указать ее на Post Schema
модель. Таким образом, пользователи могут правильно связать публикацию и свое имя пользователя с ними. Теперь я хочу, чтобы пользователи создавали категории для создаваемых ими сообщений, и я хочу, чтобы эта категория была связана с конкретным сообщением, в котором пользователь разместил сообщение. Я сослался на Category Schema
модель в Post
модель и используемый populate()
метод. После того, как пользователь создаст сообщение, категория не отображается в сообщении. Создание категории работает хорошо. Но категория не заполняется. Кажется, я сделал это неправильно. Вот мой код:
Модель Пост-Схемы
const mongoose = require("mongoose"); //import mongoose
const Schema = mongoose.Schema;
const PostSchema = new mongoose.Schema(
{
title:{
type: String,
required: true,
unique: true
},
description:{
type: String,
required: true,
},
postPhoto:{
type: String,
required:false,
},
username:{
type: Schema.Types.ObjectId,
ref: 'User'
},
categories:{
type: Schema.Types.ObjectId, //referenced Category Schema Model
ref: 'Category"'
},
}, {timestamps: true}
);
//exporting this schema
module.exports = mongoose.model("Post", PostSchema); //the module name is "Post"
Модель Схемы категорий
const mongoose = require("mongoose"); //import mongoose to be used
const Schema = mongoose.Schema;
const CategorySchema = new mongoose.Schema(
{
catname:{
type: String,
required: false,
}
}, {timestamps: true}
);
//exporting this schema
module.exports = mongoose.model("Category", CategorySchema); //the module name is "Post"
Почтовый маршрут
router.get("/:id", async(req, res)=>{
try{
const post = await Post.findById(req.params.id).populate('username').populate(' categories')
//const post = await Post.findById(req.params.id );
res.status(200).json(post)
}catch(err){
res.status(500).json(err)
}
})
Категория маршрут
//creating catergory logic
router.post("/", async (req, res) =>{
const newCat = new Category(req.body);//we create a new category for the database
try{
const savedCategory = await newCat.save();//we need to try and catch the new category and save it
res.status(200).json(savedCategory)
}catch(err){
res.status(500).json(err)
}
})
Ответ №1:
В вашем запросе есть опечатка. У вас есть дополнительная space
плата при заполнении категорий.
Измените это:
.populate(' categories')
с этим:
.populate('categories')
Комментарии:
1. Спасибо, что пытались мне помочь. Я сделал это, но это все еще не работает. Я создал сообщение в postman, там не было раздела категории, на который я ссылался.
Ответ №2:
В написанной вами схеме есть небольшая проблема,
имя поля-категории, что подразумевает, что оно должно быть массивом идентификаторов объектов категории
например, в сообщении может быть «Технология», «Python» и т. Д…
измените поле категории в схеме записи следующим образом
categories:[{ type: mongoose.Schema.Types.ObjectId, ref: "Category" }]
Причина, по которой вы не можете видеть категории, когда заполняете их в маршруте ПОЛУЧЕНИЯ сообщения, заключается в том, что логика, которую вы написали, предназначена для добавления новой категории, поэтому здесь никогда не говорится, к какой категории относится это сообщение? Вы можете добавить новый маршрут для добавления кетгорий в логику post следующим образом
//? Adding category to post logic
router.post("/:category_id/:post_id", async (req, res) =>{
try{
const {category_id, post_id} = req.params//? get the category Id
//?and Post Id from the route params.
//? Find the post you want to add the category
await Post.findByIdAndUpdate(
{_id:post_id},
{ $push: { categories: category_id } },
{new:true},
)
res.status(200).json(savedCategory)
}catch(err){
res.status(500).json(err)
}
})
эта логика добавит идентификатор категории в поле категории в сообщении.
Теперь вы запрашиваете публикацию и заполняете поля категорий, вы получите категории, с которыми связана публикация
Комментарии:
1. О, спасибо, что попытались мне помочь. Я смог решить свою проблему несколько дней назад, так как до сих пор не получал никакой помощи, пока не проверил. Я просто изменил всю систему. Я удалил модель категории. Я использовал только модель публикации вместе с разделом объектов категорий. Я сопоставил в react и выбрал все категории. Я использовал метод javascript для отображения только уникальных значений на боковой панели. Таким образом, у каждого поста были свои категории, и все категории уникальных значений отображались на боковой панели. Я попробую ваш метод, когда захочу реализовать функции комментариев. Я думаю, что это может пригодиться там.