Можно ли присвоить связанным элементам в коллекции один и тот же идентификатор?

#reactjs #mongodb #express #mongoose

#reactjs #mongodb #выражать #мангуст

Вопрос:

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

Просмотрите маршрут и модель публикации

 app.post('/api/add-review',(req,res) => {
    const review = new Review(req.body)
    review.save()
    .then(() => {
        console.log('review successfully posted')
        res.status(200)
    })
    .catch(err => {
        console.log(err)
    })
})
 
 const mongoose = require('mongoose')
const Schema = mongoose.Schema

const reviewSchema = new Schema({
    userName:String,
    stars:String,
    title:String,
    photo:String,
    blurb:String,
    cafe:String
}, {timestamps:true})

const Review = mongoose.model('reviews', reviewSchema)

module.exports = Review
 

Кафе ПОЛУЧАЕТ маршрут и модель

 app.get('/api/all-cafes', (req,res) => {
    Cafe.find()
    .then((result) => {
        res.send(result)
    })
    .catch(err => {
        console.log(err)
    })
})
 
 const mongoose = require('mongoose')
const Schema = mongoose.Schema

const cafeSchema = new Schema({
    cafeName:String,
    photoURL:String,
}, {timestamps:true})

const Cafe = mongoose.model('cafes', cafeSchema)

module.exports = Cafe
 

Вот компонент, который отображает список кафе, где я хочу, чтобы пользователи могли нажимать на кафе и переходить к отзывам о кафе.

 import React, {useState, useEffect} from 'react'
import axios from 'axios'
import Cafe from './Cafe'

const CafeList = () => {
    const [cafes, setCafe] = useState([])

    useEffect(() => {
        axios.get('/api/all-cafes')
        .then(cafe => {
            setCafe(cafe.data)
        })
        .catch(err => {
            console.log(err)
        })
    },[])

    return(
            <div className = 'cafe-container-container'>
                <h2>Cafes</h2>
                <Cafe cafes = {cafes}/>
            </div>

    )
}

export default CafeList
 
 import React from 'react'
import {Link} from 'react-router-dom'

const Cafe = (props) => {
    const {cafes} = props
    return(
        <div>
            {
                cafes.map(cafe =>{
                    const {cafeName,photoURL} = cafe
                    
                    return (
                    <Link to = {`/cafe-reviews/${cafeName}`} style={{ textDecoration: 'none' }} >
                        <div className = 'cafe-container'>
                            <h2>{cafeName}</h2>
                            <img src = {photoURL}></img>
                        </div>
                    </Link>
                    )
                })
            }
        </div>
    )
}

export default Cafe
 

Ответ №1:

Я думаю, что ваш подход хорош. но вы должны добавить свойство cafe следующим образом

 const reviewSchema = new Schema({
    userName:String,
    stars:String,
    title:String,
    photo:String,
    blurb:String,
    cafe:{
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'Cafe'
    }
}, {timestamps:true});
```
and add this in you cafeSchema
```
cafeSchema.virtual('reviews', {
    ref: 'Review',
    localField: '_id',
    foreignField: 'cafe'
});
```
Using in this way has several benefits like if you are accessing any review you do not need to go back and fetch info about its cafe there will be whole cafe object not only id..there is som other things you can explore about it
 

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

1. Спасибо за ваш ответ — я попробовал ваш код, но получил обратно только пустой массив.

2. Откуда у вас пустой массив? Я имею в виду то, к чему вы пытаетесь получить доступ?