需要做很多评论属于一篇文章关系MongoDB

时间:2017-02-19 10:36:35

标签: node.js mongodb mongoose

我使用的是Mongoose / MongoDB,我试图将很多评论与一篇文章联系起来。我的应用程序首先从网站上抓取,然后用户可以选择将每篇文章保存到MongoDB中。当用户选择保存一篇文章时,我将其保存到数据库中。因此,当用户点击其中一个已保存的文章时,他们可以对其进行评论。每篇文章都有自己的评论部分,我需要检索正确的评论。

//我在JS文件中发表评论请求

function postComment(){

    var articleComment = {
        comment: $('#comment').val().trim()
    }

    $.post('/comments/' + articleID, articleComment).done(function(data){
        $('.main-popup').fadeOut();
        console.log('DONNE', data);
    });
}

//在控制器中发布路径

router.post('/comments/:id', function(req, res){

    var newComment = new Comment(req.body);

    newComment.save(function(err, doc){
        if(err){
            console.log(err);
        }else{
            Comment.findOneAndUpdate({ "_id": doc._id }, { "article": req.params.id }).exec(function(err, doc){
                if(err){
                    console.log(err);
                    res.send(err);
                }else{
                    res.send(doc);
                }
            });
        }
    });

});

//点击特定文章

获取获取正确评论的请求
function showCommentBox(){

    $('.comments').empty();
    $('#comment').val("");
    articleID = $(this).attr('data-article-id');

    $.get('/comments/' + articleID, function(data){


        if(data.article){ //This is undefined*********************
            for(var x = 0; x < data.comment.length; x++){

                $('.comments').append("<div><h2>" + data.comment[x].comment + "</h2><span><button>&times;</button></span></div>");
            }
        }
        $('.main-popup').fadeIn();
    });


}

//在控制器中获取路径

router.get('/comments/:id', function(req, res){
    Comment.findOne({ "article": req.params.id }).populate("article").exec(function(err, doc){

        if(err){
            console.log(err)
        }else{
            res.json(doc);
        }
    }); 
});

//文章模型

var mongoose = require('mongoose');
var Schema = mongoose.Schema;


var ArticleSchema = new Schema({

    title: {
        type: String
    },
    link: {
        type: String
    },
    description: {
        type: String
    },
    img: {
        type: String
    }
});

var Article = mongoose.model("Article", ArticleSchema);

module.exports = Article;

//评论模型

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var CommentSchema = new Schema({

    comment: {
        type: String
    },
    article: {
        type: Schema.Types.ObjectId,
        ref: 'Article'
    }

});


var Comment = mongoose.model('Comment', CommentSchema);
module.exports = Comment;

1 个答案:

答案 0 :(得分:0)

首先,当你执行.findOneAndUpdate时,你缺少$ set。另外我认为你应该在设置之前将字符串转换为Mongo ObjectId。 所以它可能看起来像这样:

const ObjectId = mongoose.Types.ObjectId;

Comment.findOneAndUpdate({ "_id": doc._id }, {$set: {"article": new ObjectId(req.params.id) }})

此外,您不需要进行2次数据库调用。您可以在保存newComment之前使用文章ID,然后只需将其作为响应发送:

//Please notice that mongoose.Schema.Types.ObjectId and mongoose.Types.Object are different types.
//You need this one here:
const ObjectId = mongoose.Types.ObjectId;

router.post('/comments/:id', function(req, res){
	var newComment = new Comment(req.body);
	newComment.article = new ObjectId(req.params.id);

	newComment.save(function(err, doc){
		if (err) {
			console.error(err);
			res.send(err);

			return;
		}

		res.send(doc);
	});
});