Чтобы обновить отдельный элемент из массива, вам нужен оператор обновления массива $[<identifer>
] . Для сценария, описанного в вашем вопросе, запрос на обновление на сервере должен выглядеть примерно так:
blog.collection("posts").updateOne(
{ "_id": ObjectId(req.body.post_id), },
{ $set: { "comments.$[comment].approve": req.body.approve } },
{ arrayFilters: [{ "comment._id": ObjectId(req.body.commentId) }] },
function (error, document) {
res.send({
text: "comment approved"
});
}
)
РЕДАКТИРОВАТЬ (проблемы с интерфейсом / исправление)
Так что я решил Есть также некоторые проблемы с кодом переднего конца. Это редактирование пытается объяснить / исправить эти проблемы.
Проблемы:
1. Бэкэнд ожидает commentId
в объекте запроса (req.body .commentId) чтобы иметь возможность идентифицировать комментарий для обновления, но вы не отправляете его из внешнего интерфейса.
2. Бэкэнду нужен идентификатор сообщения, чтобы однозначно идентифицировать сообщение для обновления, но вы не отправляете его из внешнего интерфейса.
3. Значение approve
в данных формы, отправляемых из внешнего интерфейса, является строкой и всегда будет "true"
. Это не то, что вы хотите, вы хотите отправить логическое значение (true
или false
) в зависимости от того, установлен флажок или нет.
Исправление:
Обновите шаблон формы следующим образом:
<form method="post" onsubmit="return doApprove(event);">
<input type="hidden" name="post_id" value="<%= post._id %>" />
<input type="hidden" id="<%= comment._id %>" name="comment_id" />
<td> <input class="approve-comment" type="checkbox" name="approve" value="true">
<button class="btn btn-info" value="Approve"/>
</td>
</form>
Изменения:
- Обработчик doApprove
, присоединенный к событию отправки формы, теперь вызывается с event
вместо this
.
- я обновил значение атрибута id для элемента input#name="comment_id"
до фактического значения comment._id
.
А в теге script обновите функцию doApprove
до этой :
function doApprove(event) {
event.preventDefault();
const form = event.target;
var formData = {
approve: form.approve.checked, // form.approve.checked would be true if the checkbox is checked and false if it isn't
post_id: form.post_id.value, // The value of the input#name=post_id element
commentId: form.comment_id.id, // The id attribute of the input#name=comment_id element
};
$.ajax({
url: "/do-edit-comment",
method: "POST",
data: formData,
success: function (response) {
formData._id =response._id;
alert(response.text);
}
});
return false;
}
Надеюсь, это поможет.