我想在帖子中更新评论。我首先检索看起来像这样的帖子文档。
{
"_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
}
假设我想用“_id”ObjectId(“5a3c02379e65351f9c18ba1a”)更新评论。
我没有运气就尝试了以下内容。
const post = await Post.findById(req.body.postID);
await post.update({'comments._id' : req.body.commentID},{$set : {
'comments.$.commentBody': req.body.comment
}
});
这给了我以下错误: MongoError:不能使用part(comments._id的注释)来遍历元素
任何建议都将不胜感激。提前谢谢!
答案 0 :(得分:1)
您可以尝试这样的事情::
Post.findOneAndUpdate(
{ "_id": req.body.postID, "comments._id": req.body.commentID },
{
"$set": {
'comments.$.commentBody': req.body.comment
}
},
function(err,doc) {
}
);
答案 1 :(得分:0)
我不确定如何在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"}
])
限制文档,以便仅显示特定的用户ID注释。之后,添加了评论和更新的评论。最后在没有更新查询的情况下替换聚合中的原始内容(请注意,如果运行查询,将替换集合)。我没有广泛地测试这个,但是在我当地的小数据集中工作。但是,您可能需要对此查询添加一些调整,然后检查如何将相同的查询添加到node.js