Как использовать findByIdAndUpdate на mongodb? - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в кодировании, и у меня возникла проблема с тем, как правильно использовать MongoDB.У меня есть класс родительского объекта, содержащий массив объектов - комментариев.Я пытаюсь обновить содержание 1 выбранного комментария.

Первоначально я обновил состояние всей "классной комнаты" в реакции и передал все данные и $ set {req.body} в findByIdAndUpdate.

Я хочу добиться того же результата, еслиЯ только передаю свой запрос axio classId, commentId и данные комментариев, а не весь класс / все комментарии

Я пытался отфильтровать выбранный комментарий из массива комментариев и конкатить обновленный комментарий, но это не сработало.Понятно, что я имею представление о том, что происходит, и документы не облегчают мне понимание.

моя схема класса:

var ClassroomSchema = new Schema({
  title: String,
  teacher: String,
  info: String,
  image_url: String,
  comments: [Comment.schema]
});

схема комментария:

var CommentSchema = new Schema()

CommentSchema.add({
    content: String,
    comments: [CommentSchema],
    created_at: {
        type: Date,
        default: Date.now
    }
});

оригинальное решение:

function update(req, res){
    Comment.findById(req.params.comment_id, function(err, comment) {
        if(err) res.send(err)
        comment.content = req.body.content;
        comment.save();
        console.log(req.body.comments)
        Classroom.findByIdAndUpdate(req.params.classroom_id,
            {$set: req.body}, function(err, classroom){
            if (err) {
                console.log(err);
                res.send(err);
            } else {
                commentToUpdate = req.body.commentData;
                res.json(classroom);
            }
        });
    });
}

моя текущая неудачная попытка:

function update(req, res){
    console.log('update => req.body: ', req.body);
    console.log('req.params', req.params)
    Comment.findById(req.params.comment_id, function(err, comment) {
        if(err) res.send(err)

        comment.content = req.body.content;
        comment.save();
        console.log('comment: ', comment);

        Classroom.findById(req.params.classroom_id, function(err, classroom) {
                console.log('CLASSROOM findByIdAndUpdate classroom: ', classroom)
                // console.log('reg.body: ', req.body)
            if (err) {
                console.warn('Error updating comment', err);
                res.send(err);
            } else {
                // commentToUpdate = req.body.commentData;
                old_comments = classroom.comments;
                console.log('comments: ', old_comments);

                Classroom.findByIdAndUpdate(req.params.classroom_id, 
                        {$set: 
                            { comments: old_comments.filter(comt._id !== comment._id).concat(comment)} 
                        }, function(err, updatedClassroom) {
                            if (err) {
                                console.warn(err);
                            } else {
                                res.json(updatedClassroom);
                            }
                }); 
            }
        });
    });
}

1 Ответ

0 голосов
/ 16 апреля 2019

не проверял, но попробуйте это.

function update(req, res) {
  Classroom.update(
    { _id: req.params.classroom_id, "comments._id": req.params.comment_id },
    { $set: { "comments.$.content": req.body.content } },
    function(err) {
     ..
    }
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...