首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从嵌套数组4中删除多个对象

从嵌套数组4中删除多个对象
EN

Stack Overflow用户
提问于 2022-11-06 16:29:16
回答 1查看 45关注 0票数 1

请帮助我试图从损坏的子对象中清除文档,以前的问题中提出的解决方案很少适用于大多数情况,但在某些特定情况下,在同一嵌套级别上有更多不应清除的对象:

示例文档:

代码语言:javascript
运行
复制
 {
"_id": ObjectId("5c05984246a0201286d4b57a"),
f: "x",
"_a": [
  {
    "_onlineStore": {}
  },
  {
    "_p": {
      "s": {
        "a": {
          "t": [
            {
              id: 1,
              "dateP": "20200-09-20",
              did: "x",
              dst: "y",
              den: "z"
            },
            {
              id: 2,
              "dateP": "20200-09-20"
            }
          ]
        },
        "c": {
          "t": [
            {
              id: 3,
              "dateP": "20300-09-22"
            },
            {
              id: 4,
              "dateP": "20300-09-23",
              did: "x",
              dst: "y",
              den: "z"
            },
            {
              id: 5,
              "dateP": "20300-09-23"
            }
          ]
        }
      },
      h: "This is cleaned but it shauld not"
    }
  }
  ]
 }

所有从_a._p.s.a|c|d.t中丢失的对象,dst,den都需要删除,预期结果:

代码语言:javascript
运行
复制
[
{
"_a": [
  {
    "_onlineStore": {}
  },
  {
    "_p": {
      "s": {
        "a": {
          "t": [
            {
              "dateP": "20200-09-20",
              "den": "z",
              "did": "x",
              "dst": "y",
              "id": 1
            }
          ]
        },
        "c": {
          "t": [
            {
              "dateP": "20300-09-23",
              "den": "z",
              "did": "x",
              "dst": "y",
              "id": 4
            }
          ]
        }
      },
       h: "This is cleaned but it shauld not"
    }
  }
],
"_id": ObjectId("5c05984246a0201286d4b57a"),
"f": "x"
}
]

由@nimrod & @rickhg12hs 这里:提供的非常好的解决方案,但不幸的是并非所有情况都有效,例如,在"s“之外的"_a._p”级别上有更多的键/值的情况下,"s“旁边的其他键/值被清除为_a._p.h:”.“在这个例子中,如果有什么简单的选项可以用mongo更新查询来解决,请给出建议?

操场实例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-06 17:42:07

一种选择是将$mergeObjects添加到聚会中:

代码语言:javascript
运行
复制
db.collection.update({},
[
  {
    "$set": {
      "_a": {
        "$map": {
          "input": "$_a",
          "as": "elem",
          "in": {
            "$cond": [
              {
                $or: [
                  {
                    "$eq": [
                      {
                        "$type": "$$elem._p"
                      },
                      "missing"
                    ]
                  },
                  {
                    "$eq": [
                      {
                        "$type": "$$elem._p.s"
                      },
                      "missing"
                    ]
                  }
                ]
              },
              "$$elem",
              {
                $mergeObjects: [
                  "$$elem._p",
                  {
                    "s": {
                      "$arrayToObject": {
                        "$map": {
                          "input": {
                            "$objectToArray": "$$elem._p.s"
                          },
                          "as": "anyKey",
                          "in": {
                            "k": "$$anyKey.k",
                            "v": {
                              "t": {
                                "$filter": {
                                  "input": "$$anyKey.v.t",
                                  "as": "t",
                                  "cond": {
                                    "$setIsSubset": [
                                      [
                                        "did",
                                        "dst",
                                        "den"
                                      ],
                                      {
                                        "$map": {
                                          "input": {
                                            "$objectToArray": "$$t"
                                          },
                                          "in": "$$this.k"
                                        }
                                      }
                                    ]
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                ]
              }
            ]
          }
        }
      }
    }
  }
],
{
  "multi": true
})

看看它如何在操场实例上工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74337688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档