在 MERN-stack 书评应用程序中获取书评的路线?

问题描述 投票:0回答:2

我正在尝试编写一个用于审阅书籍的 MERN 堆栈应用程序。

我有 2 个 MongoDB (Mongoose) 模式:

models/Book.js
models/Review.js
,其中一本书可以有多个评论。

这些是我的架构:

模型/Review.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

let reviewSchema = new Schema(
    {
        text: {
            type: String
        },
        book: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Book'
        }
    }
);

module.exports = mongoose.model('Review', reviewSchema)

模型/Book.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

let bookSchema = new Schema(
    {
        title: {
            type: String
        },
        detail: {
            type: String
        }
    }, {
        collection: 'books'
    }
);

module.exports = mongoose.model('Book', bookSchema)

如果我想通过以下 URL 获取有关一本书的所有数据,路线应该是什么样的:

/book/<book_id_from_mongodb>

我只能获取书籍的数据,但我不知道如何获取属于该特定书籍的所有评论:

/routes/book.route.js:

let mongoose = require('mongoose'),
    express = require('express'),
    router = express.Router();

let bookSchema = require('../models/Book');
let reviewSchema = require('../models/Review');

// Get a single book - HOW SHOULD I MODIFY THIS ROUTE TO GET ALSO ALL REVIEWS FOR THAT BOOK ?
router.route('/book/:id').get((req, res) => {
    bookSchema.findById(req.params.id, (error, data) => {
        if (error) {
            res.status(500).send(err);
        } else {
            res.status(200).json(data)
        }
    })
})

我尝试过这个(不起作用):

router.route('/book/:id').get((req, res) => {
    bookSchema.findById(req.params.id, (error, data) => {
        if (error) {
            res.status(500).send(err);
        } else {
            var bookData = data;

            reviewSchema.find({"book": mongoose.Schema.Types.ObjectId(req.params.id)}, (error, data) => {
                if (error) {
                    res.status(500).send(err);
                } else {
                    var reviewData = data;

                    bookData.reviews = reviewData;

                    res.status(200).json(bookData);
                }
            });
        }
    })
})
node.js reactjs mongodb express mongoose
2个回答
0
投票

最好的方法是将评论元素放入您的 bookSchema 中并引用评论的 ObjectId。

然后在您的获取路线上,使用 .populate("reviews").exec(您的回调)。

图书架构

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

let bookSchema = new Schema(
    {
        title: {
            type: String
        },
        detail: {
            type: String
        }
    }, {
        collection: 'books'
    }, {
        reviews: [
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Review'
        ]
    }
);

module.exports = mongoose.model('Book', bookSchema)

路线

let mongoose = require('mongoose'),
    express = require('express'),
    router = express.Router();

let bookSchema = require('../models/Book');
let reviewSchema = require('../models/Review');

// Get a single book - HOW SHOULD I MODIFY THIS ROUTE TO GET ALSO ALL REVIEWS FOR THAT BOOK ?
router.route('/book/:id').get((req, res) => {
    bookSchema.findById(req.params.id).populate("reviews").exec((error, data) => {
        if (error) {
            res.status(500).send(err);
        } else {
            res.status(200).json(data)
        }
    })
})

创建评论时,您需要将其推送到 bookSchema.reviews,然后使用 bookSchema.save() 。

如果不起作用请告诉我。

我可能错过了一些东西。


0
投票

最好的方法是将评论元素放入您的 bookSchema 中并引用评论的 ObjectId。

然后在您的获取路线上,使用 .populate("reviews").exec(您的回调)。

© www.soinside.com 2019 - 2024. All rights reserved.