Я хочу обновить комментарий в сообщении. Сначала я извлекаю почтовый документ, который выглядит так.
{
"_id" : ObjectId("5aac169c229f0136296407d4"),
"title" : "First Node.js App",
"body" : "testing 123",
"status" : "public",
"user" : "John Doe",
"date" : ISODate("2017-12-21T18:30:09.779Z"),
"comments" : [
{
"commentBody" : "This is awesome! ",
"commentUser" : ObjectId("5a3bfd5a9e65351f9c18ba18"),
"_id" : ObjectId("5a3c02379e65351f9c18ba1a"),
"commentDate" : ISODate("2017-12-21T18:49:27.620Z")
},
{
"commentBody" : "This is second comment.",
"commentUser" : ObjectId("5a3bfd5a9e65351f9c18gt19"),
"_id" : ObjectId("5a3c02379e65351f9c18ba1b"),
"commentDate" : ISODate("2017-12-21T18:49:27.620Z")
}
],
"allowComments" : true
}
Допустим, я хочу обновить комментарий с помощью ObjectId «_id» («5a3c02379e65351f9c18ba1a»).
Я безуспешно пробовал следующее.
const post = await Post.findById(req.body.postID);
await post.update({'comments._id' : req.body.commentID},{$set : {
'comments.$.commentBody': req.body.comment
}
});
Это дало мне следующую ошибку: MongoError: нельзя использовать часть (комментарии comments._id) для обхода элемента
Любое предложение будет принято с благодарностью. Заранее спасибо!





Вы можете попробовать что-то вроде этого:
Post.findOneAndUpdate(
{ "_id": req.body.postID, "comments._id": req.body.commentID },
{
"$set": {
'comments.$.commentBody': req.body.comment
}
},
function(err,doc) {
}
);
Привет, Акшанш, спасибо за предложение. Я получаю следующую ошибку: позиционный оператор не нашел нужного совпадения из запроса. Разве вам не нужно включать идентификатор комментария «ObjectId (« 5a3c02379e65351f9c18ba1a »)», который вы хотите где-то обновить?
@ user752746 .. проверьте это stackoverflow.com/questions/26156687/…
Большое спасибо, Акшанш, эта ссылка очень помогла. Я могу обновить свой комментарий сейчас.
Я добавил ("comments._id": req.body.commentID) к вашему предложению, и это сработало.
счастливый! кодировка:) \
Я не уверен, как реализовать это в node.js, но вот запрос Mongo:
db.sample.aggregate([
{$match:{"comments.commentUser":ObjectId("5a3bfd5a9e65351f9c18ba19")}},
{$redact:{
$cond:{
if:{$or:[{$eq:["$commentUser",ObjectId("5a3bfd5a9e65351f9c18ba19")]},
{$not:"$commentUser"}]},
then:"$$DESCEND",
else:"$$PRUNE"
}
}},
{$addFields:{comments:{$map:{
input:"$comments",
as:"comment",
in:{"commentBody":"test comment", "commentUser" : "$$comment.commentUser", "_id" :"$$comment._id", "commentDate" :"$$comment.commentDate"}
}}
}},
{$out:"sample"}
])
Ограничил документ таким образом, чтобы отображались только определенные комментарии идентификатора пользователя. После этого добавлены комментарии с обновленным комментарием. Наконец, замена исходного содержимого в агрегации без запроса на обновление (обратите внимание, что коллекция будет заменена, если вы запустите запрос). Я не тестировал это всесторонне, но работал с небольшим набором данных в моем локальном хранилище. Однако вам может потребоваться внести некоторые изменения в этот запрос, а затем проверить, как вы можете добавить тот же запрос в node.js
Это может не дать вам правильный ответ построчно ... это всего лишь идея. Я немного новичок в ноде