Javascript mongodb保存在嵌套对象(node.js)应用程序中

Javascript mongodb保存在嵌套对象(node.js)应用程序中,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我从代码中得到“找不到bookid”。 我可以使用postman分别添加作者和标题,但我似乎无法使ReviewCreate功能正常工作,我是否遗漏了什么?请帮忙 我的模式 var mongoose = require('mongoose'); var reviewSchema = new mongoose.Schema({ author: { type: String, required: true

我从代码中得到“找不到bookid”。 我可以使用postman分别添加作者和标题,但我似乎无法使ReviewCreate功能正常工作,我是否遗漏了什么?请帮忙

我的模式

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


这就是我用你的推荐信得到的 错误:

TypeError:无法读取未定义的属性“push”

当我把控制台。日志(书);就在doAddrivew函数下面

    { _id: 58dd21c3cb77090b930b6063,
      titles:
       [ { title: 'this is title',
           _id: 58dd3f2701cc081056135dae,
           reviews: [],
           favouredBy: [Object] },
         { title: 'this is the second tittle',
           _id: 58dd42a59f12f110d1756f08,
           reviews: [],
           favouredBy: [Object] } ] 
    }

您的图书模式具有
标题
属性,该属性还具有
评论


更新


  • 首先,
    应该是您的
    模型的一个实例
  • bookSchema
    中定义的
    titles
    属性是一个数组,因此当您想在
    bookSchema
    中添加数据时,
    bookAuthor
    属性将只有一个字符串,但是
    titles
    字段将包含像
    [{},{},{}]
    这样的对象,因此,您必须选择
    标题
    的索引,如
    标题[0]
    标题[1]
    ,然后点击要查看的
    标题
  • 注意:由于
    [reviewSchema]
    reviews
    也是一个数组,您可以使用索引并从该数组中选择所需元素,以执行更新、删除等操作,如
    book.titles[0]。reviews[1]

    假设我想输入
    titles
    array第一个元素

    book.titles[0].reviews.push({
        author: author,
        rating: req.query.rating,
        reviewText: req.query.reviewText
    });
    

    在这里,由于
    标题中有两个对象
    ,因此必须选择要推入的对象

    如果要在
    \u id:58dd3f2701cc081056135dae的第一个对象中推送评论,
    ,请选择
    标题[0]

    对于
    \u id:58dd42a59f12f110d1756f08
    标题[1]

    由于您的数组将有多个对象,因此您必须匹配要在其中执行操作(如
    update
    )的对象,以便使用
    $
    位置运算符筛选文档

    请也看看点符号

    您的图书架构没有reviews属性。我这样做了,但我发现此错误无法读取未定义的{{id:58dd21c3cb77090b930b6063,标题:[{标题:'这是标题',{id:58dd3f2701cc081056135dae,评论:[],收藏夹:[对象]},{title:'这是第二个书名',_id:58dd42a59f12f110d1756f08,评论:[],喜欢者:[Object]}}}我想把评论推到这本书的第一个书名。
        { _id: 58dd21c3cb77090b930b6063,
          titles:
           [ { title: 'this is title',
               _id: 58dd3f2701cc081056135dae,
               reviews: [],
               favouredBy: [Object] },
             { title: 'this is the second tittle',
               _id: 58dd42a59f12f110d1756f08,
               reviews: [],
               favouredBy: [Object] } ] 
        }
    
    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.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] } ] 
        }