嵌入式数组中的Mongoose更新对象

时间:2018-04-02 18:21:27

标签: node.js mongodb mongoose

我想在帖子中更新评论。我首先检索看起来像这样的帖子文档。

{
    "_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的注释)来遍历元素

任何建议都将不胜感激。提前谢谢!

2 个答案:

答案 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