我正在尝试编写一个用于审阅书籍的 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);
}
});
}
})
})
最好的方法是将评论元素放入您的 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() 。
如果不起作用请告诉我。
我可能错过了一些东西。
最好的方法是将评论元素放入您的 bookSchema 中并引用评论的 ObjectId。
然后在您的获取路线上,使用 .populate("reviews").exec(您的回调)。