我正在努力解决 MongoDB 中保留的嵌套对象数组中的头像 URL 更新问题。
头像 URL 需要从
https://old.com/image.jpg
更新为 https://new.com/image.jpg
文档结构位于本文末尾。我需要在三个地方更新头像:
organizer.avatar
- 它有效(见下文或访问 Mongo 游乐场组织者头像)meetings[].owner.avatar
- 在 StackOverflow 上发现了类似的问题,但由于文档结构不同,它不起作用(见下文或访问 Mongo Playground-owner avatar)meetings[].participants[].avatar
- 我不知道如何处理这个问题。更新组织者头像
这非常简单,正如您在 Mongo Playground-organizer avatar 中看到的那样。
db.collection.update({},
[
{
"$set": {
"organizer.avatar": {
$replaceOne: {
input: "$organizer.avatar",
find: "https://old.com/",
replacement: "https://new.com/"
}
}
}
}
])
更新会议[].owner.avatar
它与 StackOverflow 上报告的另一个问题类似,但这里的头像嵌套在 owner
对象内。在这种情况下,运算符
$mergeObjects
无法按我的预期工作,因为它不会合并对象,而是覆盖它 - 请参阅Mongo游乐场所有者头像。 如何解决这个问题?
db.collection.update({},
[
{
"$set": {
"meetings": {
$map: {
input: "$meetings",
in: {
$mergeObjects: [
{
owner: "$$this.owner"
},
{
owner: {
avatar: {
$replaceOne: {
input: "$$this.owner.avatar",
find: "https://old.com/",
replacement: "https://new.com/"
}
}
}
}
]
}
}
}
}
}
])
更新会议[].participants[].avatar
说到更新meetings[].participants[].avatar
- do 你知道如何处理这个问题吗?
示例文档:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"eventName": "Welcome Event",
"meetings": [
{
"owner": {
"avatar": "https://old.com/dwight-schrute.png",
"name": "Dwight Schrute"
},
"participants": [
{
"avatar": "https://old.com/kevin-malonoe.png",
"name": "Kevin Malonoe"
},
{
"avatar": "https://old.com/creed-bratton.png",
"name": "Creed Bratton"
}
]
},
{
"owner": {
"avatar": "https://old.com/jim-halpert.png",
"name": "Jim Halpert"
},
"participants": [
{
"avatar": "https://old.com/pam-beesly.png",
"name": "Pam Beesly"
}
]
}
],
"organizer": {
"avatar": "https://old.com/michale-scott.png",
"name": "Michael Scott"
}
}
]
owner
的
avatar
。
avatar
数组中元素的
participants
。
db.collection.update({},
[
{
"$set": {
"meetings": {
$map: {
input: "$meetings",
in: {
$mergeObjects: [
"$$this",
{
owner: {
$mergeObjects: [
"$$this.owner",
{
name: {
$replaceOne: {
input: "$$this.owner.avatar",
find: "https://old.com/",
replacement: "https://new.com/"
}
}
}
]
}
},
{
participants: {
$map: {
input: "$$this.participants",
as: "p",
in: {
$mergeObjects: [
"$$p",
{
avatar: {
$replaceOne: {
input: "$$p.avatar",
find: "https://old.com/",
replacement: "https://new.com/"
}
}
}
]
}
}
}
}
]
}
}
}
}
}
])