0

我正在制作一个 node.js 网站。我有一个posts集合,其中帖子的评论存储在一个数组中,评论作者的详细信息作为嵌套对象。

这是新帖子的架构:

{
    "text": text,
    "image": image,
    "video": video,
    "type": type,
    "createdAt": createdAt,
    "reactions": [],
    "comments": [],
    "shares": [],
    "user": {
        "_id": user._id,
        "username": user.username
    }
}

这是被推送到其帖子的新评论:

$push: {
    "comments": {
        "_id": commentId,
        "user": {
            "_id": user._id,
            "type": type,
            "name": user.name,
            "profileImage": user.photo,
        },
        "comment": comment,
        "createdAt": createdAt,
        "replies": []
    }
}                           

为了避免将评论存储在另一个集合中并进行复杂的多次查找(我正在进行 1 次查找以获取帖子作者详细信息,但无法添加另一个以使其适用于评论)以合并新闻源,我决定保存评论及其作者的详细信息嵌入到帖子中。

现在,当用户个人资料图片更新时,所有评论都必须更新以显示新图片。

我在 server.js 文件中包含了这个 updateMany 查询以及照片更新路由:

database.collection("posts").updateMany({
    "comments.user._id": user._id,
    "comments.user.type": "friend"
}, {
    $set: {
        "comments.$.user.profileImage": photo
    }
});

这里的问题是这只会更新所有帖子中的第一个匹配评论。

我需要更新所有帖子中的所有匹配评论。

我实际上只是通过以下 youtube 视频来学习,所以请帮助我。

4

1 回答 1

0

你需要使用arrayFilters我认为。

如果我很好地理解了你的问题,这个例子应该与你的数据库相似。

查询是这样的:

db.collection.update({
  "comments.user._id": 1,
  "comments.user.type": "friend"
},
{
  "$set": {
    "comments.$[element].user.profileImage": "new"
  }
},
{
  "arrayFilters": [
    {
      "$and": [
        {
          "element.user._id": 1
        },
        {
          "element.user.type": "friend"
        }
      ]
    }
  ],
  "multi": true
})

第一部分是相同的,几乎是第二部分。您必须将element位置添加到下一步中定义的数组中。
使用arrayFilters,您可以查找与 comaprsion 匹配的那些$and。只有那些会被更新。

注意使用updateMany()方法,不一定要使用{multi: true}

于 2020-11-15T19:40:43.630 回答