mongodb保存在嵌套对象(node.js)应用程序中
我从我的代码中find“bookid not found”。 我可以使用邮递员分别添加作者和标题,但我似乎无法得到reviewsCreate函数来工作,我是否错过了什么? PLS的帮助
我的模式
var mongoose = require('mongoose'); var reviewSchema = new mongoose.Schema({ author: { type: String, required: true }, rating: { type: Number, required: true, min: 0, max: 5 }, reviewText: { type: String, required: true }, createdOn: { type: Date, "default": Date.now } }); var titleSchema = new mongoose.Schema({ title: { type: String, required: true }, favouredBy: { type:[String], required: false }, reviews: [reviewSchema] }); var bookSchema = new mongoose.Schema({ bookAuthor: { type: String, required: true }, titles: [titleSchema] }); mongoose.model('Book', bookSchema);
router.post('/books/:bookid/titles/:titleid/reviews',ctrlReviews.reviewsCreate);
module.exports.reviewsCreate = function(req, res) { if (req.params.bookid) { Bok .findById(req.params.titleid) .select('titles') .exec( function(err, book) { if (err) { sendJSONresponse(res, 400, err); } else { doAddReview(req, res, book); } } ); } else { sendJSONresponse(res, 404, { "message": "Not found, bookid required" }); } }; var doAddReview = function(req, res, book, author) { if (!book) { sendJSONresponse(res, 404, "bookid not found"); } else { book.reviews.push({ author: author, rating: req.query.rating, reviewText: req.query.reviewText }); book.save(function(err, book) { var thisReview; if (err) { sendJSONresponse(res, 400, err); } else { updateAverageRating(book._id); thisReview = book.reviews[book.reviews.length - 1]; sendJSONresponse(res, 201, thisReview); } }); } };
这是我得到的时候,我用你的build议错误:
TypeError:无法读取未定义的属性'push'
当我把console.log(书); 在doAddrivew函数下。
{ _id: 58dd21c3cb77090b930b6063, titles: [ { title: 'this is title', _id: 58dd3f2701cc081056135dae, reviews: [], favouredBy: [Object] }, { title: 'this is the second tittle', _id: 58dd42a59f12f110d1756f08, reviews: [], favouredBy: [Object] } ] }
您的书架具有进一步具有reviews
的titles
属性
做
var doAddReview = function(req, res, book, author) { if (!book) { sendJSONresponse(res, 404, "bookid not found"); } else { /* book.titles.reviews.push({ author: author, rating: req.query.rating, reviewText: req.query.reviewText }); */ book.titles[0].reviews.push({ // to push in first element author: author, rating: req.query.rating, reviewText: req.query.reviewText }); book.save(function(err, book) { var thisReview; if (err) { sendJSONresponse(res, 400, err); } else { updateAverageRating(book._id); // ----------------------------- thisReview = book.reviews[book.reviews.length - 1]; // thisReview = book.titles.reviews[book.titles.reviews.length - 1]; // here also you may have to modify sendJSONresponse(res, 201, thisReview); } }); } }
▼ 更新 ▼
- 首先,
book
应该是你的Book
模型的一个实例。 - 在
bookSchema
定义的titles
属性是一个数组,所以当你想在bookSchema
添加数据时,bookAuthor
属性只有一个string,但是bookAuthor
字段将会包含[{}, {}, {}]
,所以你必须selecttitle
titles[0]
或titles[1]
这样的titles[0]
索引,然后将其推送到要查看的title
注意:由于[reviewSchema]
reviews
也是一个数组,你可以使用索引,并从该数组中select所需的元素,执行操作如更新,删除像book.titles[0].reviews[1]
假设我想推入titles
数组的第一个元素
book.titles[0].reviews.push({ author: author, rating: req.query.rating, reviewText: req.query.reviewText });
{ _id: 58dd21c3cb77090b930b6063, titles: [ { title: 'this is title', _id: 58dd3f2701cc081056135dae, reviews: [], favouredBy: [Object] }, { title: 'this is the second tittle', _id: 58dd42a59f12f110d1756f08, reviews: [], favouredBy: [Object] } ] }
在这里,如果在titles
内有2个对象,您必须select要在其中进行推送的对象,
如果您想在_id: 58dd3f2701cc081056135dae,
第一个对象中推送评论_id: 58dd3f2701cc081056135dae,
selecttitles[0]
和_id: 58dd42a59f12f110d1756f08
, titles[1]
因为你的数组将有多个对象,所以你必须匹配你想执行update
操作的对象,所以要过滤文档,你可以使用$
位置运算符
https://docs.mongodb.com/v3.2/reference/operator/update/position/
请查看点符号也https://docs.mongodb.com/manual/core/document/#dot-notation