使用单个更新查询从深层嵌套数组中删除多个元素

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

我有以下类型的文件:

[
 {
 "_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",
              
            }
          ]
        }
      }
    }
  }
]
}
]

我需要找到删除所有没有“did”、“dst”和“den”字段的文档的更新查询,在上面的文档嵌套数组中是 id:[2,3,5] 的子对象,在真实的集合中我不知道id,是否有选项可以一次性删除所有内容?

我的游乐场尝试,但不成功

更新后的文档需要如下所示:

[
 {
 "_id": ObjectId("5c05984246a0201286d4b57a"),
f: "x",
"_a": [
  {
    "_onlineStore": {}
  },
  {
    "_p": {
      "s": {
        "a": {
          "t": [
            {
              id: 1,
              "dateP": "20200-09-20",
              did: "x",
              dst: "y",
              den: "z"
            }
          ]
        },
        "c": {
          "t": [
            {
              id: 4,
              "dateP": "20300-09-23",
              did: "x",
              dst: "y",
              den: "z"
            }
          ]
        }
      }
    }
  }
]
}
]
mongodb mongodb-query
1个回答
1
投票

这是你想要的吗?:

db.collection.update(
{},
[
  {
    $set: {
      "_a": {
        $map: {
          input: "$_a",
          as: "external",
          in: {
            $cond: [
              {
                $gt: [
                  "$$external._p",
                  0
                ]
              },
              {
                _p: {
                  s: {
                    a: {
                      t: {
                        $filter: {
                          input: "$$external._p.s.a.t",
                          as: "item",
                          cond: {
                            $and: [
                              {
                                $gt: [
                                  "$$item.did",
                                  0
                                ]
                              },
                              {
                                $gt: [
                                  "$$item.dst",
                                  0
                                ]
                              },
                              {
                                $gt: [
                                  "$$item.den",
                                  0
                                ]
                              }
                            ]
                          }
                        }
                      }
                    }
                  },
                  c: {
                    t: {
                      $filter: {
                        input: "$$external._p.s.c.t",
                        as: "item",
                        cond: {
                          $and: [
                            {
                              $gt: [
                                "$$item.did",
                                0
                              ]
                            },
                            {
                              $gt: [
                                "$$item.dst",
                                0
                              ]
                            },
                            {
                              $gt: [
                                "$$item.den",
                                0
                              ]
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "$$external"
            ]
          }
        }
      }
    }
  }
], 
{multi:true})

查看它在 playground 示例中的工作原理

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