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] } ] } 

您的书架具有进一步具有reviewstitles属性

 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); } }); } } 

更新


  1. 首先, book应该是你的Book模型的一个实例。
  2. 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: 58dd42a59f12f110d1756f08titles[1]

因为你的数组将有多个对象,所以你必须匹配你想执行update操作的对象,所以要过滤文档,你可以使用$位置运算符

https://docs.mongodb.com/v3.2/reference/operator/update/position/

请查看点符号也https://docs.mongodb.com/manual/core/document/#dot-notation