2017-12-10 7 views
1

私は、オブジェクトのサブ文書の格付けをインクリメントするMongooseを使ってNodeJSで経路を作っています。私は以下のモデルとルートコードを投稿します。 Postmanでクエリを実行すると、空のjsonオブジェクトが返され、400エラーが返されます。これは、クエリのどこかで何か間違っていることを意味します。Mongooseでサブ文書のプロパティを増やすにはどうすればよいですか?

ブログ投稿のモデル

const BlogPostSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    rating: Number, 
    title: String, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    board: {type: Schema.Types.ObjectId, ref: 'board'}, 
    comments: [commentSchema] 
}); 

const BlogPost = mongoose.model('blogPost', BlogPostSchema); 

module.exports = BlogPost; 

コメントスキーマ

const CommentSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    rating: Number 
}); 

module.exports = CommentSchema; 

NodeJSルート

routes.put('/blogPosts/:id/comment/:idm', function(req, res) { 
    const blogPostId = req.param('id'); 
    const commentId = req.param('idm'); 

    BlogPost.findById(blogPostId) 
     .then((blogPost) => { 
      blogPost.comments.findByIdAndUpdate({_id: commentId}, {$inc: {rating: 1}}); 
     }) 
     .then((blogPost) => res.status(200).json({ 
     'status': 'Comment rating is increased.' 
    })) 
    .catch((error) => res.status(400).json(error)) 
}); 

これは番目ですeレスポンスPostMan

すべてのご協力をお願いいたします。

+0

'findByIdAndUpdate()'メソッドは思わ名。あなたは 'blogPost.comments.findByIdAndUpdate(commentId、{$ inc:{rating:1}}))ではないはずですか?代わりに 'findOneAndUpdate()'メソッドを代わりに使用することもできます。ドキュメントは同意するようです:http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate –

+0

質問/説明のカップル: 1. req.paramの代わりにreq.params 2. 'blogPost.comments.findByIdAndUpdate 'これは有効ですか?私は前にこのように働いたことがないので推測しています。 3. B.Flemingが述べたように、 'findByIdAndUpdate'は最初のパラメータとして' id'を取ります。それをクエリとして入れる必要はありません。 –

答えて

0

これは誤りでした:

BlogPost.findById(blogPostId) 
    .then((blogPost) => { 
     blogPost.comments.findByIdAndUpdate({_id: commentId}, {$inc: {rating: 1}}); 
    }) 
    .then((blogPost) => res.status(200).json({ 
    'status': 'Comment rating is increased.' 
})) 

は次のようになります。それだけの方法で行く、最初のパラメータのための唯一のIDを期待するよう

BlogPost.update({_id: blogPostId, 'comments._id': commentId}, {$inc:{'comments.$.rating':1}}) 
    .then((blogPost) => res.status(200).json({ 
    'status': 'Comment rating is increased.' 
}))