MongoDB - 更新多个文档中数组中的多个子文档

MongoDB - Update multiple subdocuments in array in multiple documents

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

这是 post 的新架构:

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

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

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

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

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

我在 server.js 文件中包括了这个 updateMany 查询和照片更新路径:

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

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

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

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

我认为你需要使用arrayFilters

如果我理解你的问题 this 示例应该与你的数据库相似。

查询是这样的:

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,您可以查找与 $and 匹配的那些。并且只有那些会被更新。

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