用嵌套对象替换对象数组中的子字符串

问题描述 投票:0回答:1

我正在努力解决 MongoDB 中保留的嵌套对象数组中的头像 URL 更新问题。

头像 URL 需要从

https://old.com/image.jpg
更新为
https://new.com/image.jpg

文档结构位于本文末尾。我需要在三个地方更新头像:

  1. organizer.avatar
    - 它有效(见下文或访问 Mongo 游乐场组织者头像
  2. meetings[].owner.avatar
    - 在 StackOverflow 上发现了类似的问题,但由于文档结构不同,它不起作用(见下文或访问 Mongo Playground-owner avatar
  3. 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

 - d
o 你知道如何处理这个问题吗?

示例文档:

[ { "_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" } } ]
    
mongodb
1个回答
0
投票
您的更新查询应包含以下概念以实现预期结果:

  1. 合并迭代对象。

  2. 更新迭代的

    owner

    avatar

  3. 更新迭代对象的

    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/" } } } ] } } } } ] } } } } } ])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.