MongoDB:在多个条件下更新数组元素

MongoDB: Update array elements on multiple conditions

各位同事,下午好! 我正在努力解决一些问题。我正在使用 MongoDB 4.4.4。我的作业如下所示:

  1. 有一组元素methods[].subcategories[].actions[]。请注意,所有对象都是数组,它们可能不存在。 actions[] 数组的元素由 _idtitle 字段组成。
  2. 需要通过元素的字段actions.title找到recordId的实际值写入actions数组的元素

当前值列表:

0af4cd2e-78cb-109b-8178-d5a7ba0e0012, Inspection
0af4cd2e-78cb-109b-8178-d5a7ba130014, Screening
0af4cd2e-78cb-109b-8178-d5a7ba170016, Poll
0af4cd2e-78cb-109b-8178-d5a7ba1b0018, Getting written explanations
0af4cd2e-78cb-109b-8178-d5a7ba1e001a, Request for documents
0af4cd2e-78cb-109b-8178-d5a7ba21001c, Sampling (samples)
0af4cd2e-78cb-109b-8178-d5a7ba23001e, Instrumental examination
0af4cd2e-78cb-109b-8178-d5a7ba260020, Test
0af4cd2e-78cb-109b-8178-d5a7ba2b0022, Expertise
0af4cd2e-78cb-109b-8178-d5a7ba2d0024, Experiment
3b7205c1-8282-4b63-8121-b82aacd7ca67, Request for documents that, in accordance with the mandatory requirements, must be located at the location (carrying out activities) of the controlled person (its branches, representative offices, separate structural divisions) or the object of control

我写了下面的代码:

db.getSiblingDB("ervk_core").getCollection("supervision1").updateMany(
    {},
    {
        "$set": {
            "methods.subcategories.actions.$[elem1]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0012",
            "methods.subcategories.actions.$[elem2]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0014",
            "methods.subcategories.actions.$[elem3]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0016",
            "methods.subcategories.actions.$[elem4]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0018",
            "methods.subcategories.actions.$[elem5]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001a",
            "methods.subcategories.actions.$[elem6]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001c",
            "methods.subcategories.actions.$[elem7]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001e",
            "methods.subcategories.actions.$[elem8]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260020",
            "methods.subcategories.actions.$[elem9]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260022",
            "methods.subcategories.actions.$[elem10]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260024",
            "methods.subcategories.actions.$[elem11]._id": "3b7205c1-8282-4b63-8121-b82aacd7ca67",
        }
    },
    {
        "arrayFilters": [
            {
                "elem1.title": "Inspection",
            },
            {
                "elem2.title": "Search",
            },
            {
                "elem3.title": "Poll",
            },
            {
                "elem4.title": "Receipt of Written Explanations",
            },
            {
                "elem5.title": "Retrieval of Documents",
            },
            {
                "elem6.title": "Sampling (samples)",
            },
            {
                "elem7.title": "Instrumental examination",
            },
            {
                "elem8.title": "Trial",
            },
            {
                "elem9.title": "Expertise",
            },
            {
                "elem10.title": "Experiment",
            },
            {
                "elem11.title": "Request for documents that, in accordance with the mandatory requirements, must be located at the location (carrying out activities) of the controlled person (its branches, representative offices, separate structural divisions) or the object of control",
            }
        ]
    }
);

然而,它给出了错误"The path 'methods.subcategories.actions' must exist in the document in order to apply array updates."。我明白为什么会发生 - 由于缺少 actions[] 数组。但是我怎么能解释 methods[].subcategories[].actions[] 数组可能丢失的事实。还有我是不是把代码写对了,不然我已经有点糊涂了。非常感谢!

您可以对方法和子类别对象添加数组过滤器检查以查看嵌套数组是否存在,这将解决您的问题,因为 Mongo 将不会继续检查嵌套条件以防它们不存在不存在。以下是您的操作方式:

db.collection.updateMany(
{
  "methods.subcategories.actions": {
    $exists: true
  }
},
{
  "$set": {
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem1]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0012",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem2]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0014",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem3]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0016",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem4]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e0018",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem5]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001a",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem6]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001c",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem7]._id": "0af4cd2e-78cb-109b-8178-d5a7ba0e001e",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem8]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260020",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem9]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260022",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem10]._id": "0af4cd2e-78cb-109b-8178-d5a7ba260024",
    "methods.$[methodElem].subcategories.$[subCatElem].actions.$[elem11]._id": "3b7205c1-8282-4b63-8121-b82aacd7ca67"
  }
},
{
  "arrayFilters": [
    {
      "methodElem.subcategories": {
        $exists: true
      }
    },
    {
      "subCatElem.actions": {
        $exists: true
      }
    },
    {
      "elem1.title": "Inspection"
    },
    {
      "elem2.title": "Search"
    },
    {
      "elem3.title": "Poll"
    },
    {
      "elem4.title": "Receipt of Written Explanations"
    },
    {
      "elem5.title": "Retrieval of Documents"
    },
    {
      "elem6.title": "Sampling (samples)"
    },
    {
      "elem7.title": "Instrumental examination"
    },
    {
      "elem8.title": "Trial"
    },
    {
      "elem9.title": "Expertise"
    },
    {
      "elem10.title": "Experiment"
    },
    {
      "elem11.title": "Request for documents that, in accordance with the mandatory requirements, must be located at the location (carrying out activities) of the controlled person (its branches, representative offices, separate structural divisions) or the object of control"
    }
  ]
})

Mongo Playground

我还更改了更新查询以忽略没有嵌套操作的文档,这只是为了节省时间。