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}
我正在制作一个 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}