2017-02-19 3 views
1

Я использую Mongoose/MongoDB, и я пытаюсь связать многие комментарии к одной статье. Мое приложение начинается с соскабливания с веб-сайта, а затем у пользователя есть возможность сохранить каждую статью, которая была очищена в 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; 

ответ

0

Во-первых, вы теряете $ набор, когда вы делаете .findOneAndUpdate. Также, я думаю, вы должны преобразовать строку в Mongo ObjectId перед ее настройкой. Так может выглядеть likt это:

const ObjectId = mongoose.Types.ObjectId; 
 

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

Также вам не нужно делать 2 обращений к базе данных. Вы могли бы идентификатор статьи перед сохранением Новый_комментария, а затем просто отправить его в ответ, как это:

//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){ 
 
\t var newComment = new Comment(req.body); 
 
\t newComment.article = new ObjectId(req.params.id); 
 

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

 
\t \t \t return; 
 
\t \t } 
 

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

+0

Хорошо, спасибо за вход. Однако, мне кажется, мне нужно два вызова в базу данных. Когда пользователь нажимает кнопку комментариев, это делает мои комментарии модальными для отображения. Кнопка отправки внутри моего модальности комментариев - это то, что делает почтовый запрос. – henhen

+0

@ANonymous Я говорил о другом. Вы делаете 2 вызова вместо 1 внутри своей конечной точки POST. 1) .save go to to mongo 2) .findOneInUpdate перейти к mongo и модифицировать один и тот же документ. Это нужно сделать за один звонок. –

Смежные вопросы