mongodb:针对嵌套数组 objects 的 updatemany

mongodb: updatemany against nested array objects

这是我当前的文档:

{
   "_id":"d283015f-91e9-4404-9202-093c28d6a931",
   "referencedGeneralPractitioner":[
      {
         "resourceType":"practitioner",
         "id": "id1",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"14277399B"
               }
            }
         ]
      }
   ]
}

只有一个文件,但是进入这个collection patient我有很多病人

我需要更新每个文档,其中:

  1. 包含 referencedGeneralPractitioner.id is "xxx"
  2. 用传入的更新整个 referencedGeneralPractitioner[matched_document]

例如,假设我在 patient collection:

上有底部文档
{
   "_id":"d283015f-91e9-4404-9202-093c28d6a931",
   "referencedGeneralPractitioner":[
      {
         "resourceType":"practitioner",
         "id": "id1",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"14277399B"
               }
            },
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"43756837R"
               }
            }
         ]
      }
   ]
},
{
   "_id":"df342343-45d5-cf4a-8374-17dc436d40ca",
   "referencedGeneralPractitioner":[
      {
         "resourceType":"practitioner",
         "id": "id1",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"14277399B"
               }
            },
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"43756837R"
               }
            }
         ]
      },
      {
         "resourceType":"practitioner",
         "id": "id2",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"48596705T"
               }
            }
         ]
      }
   ]
}

我需要 db.patient.referenceGeneralPractitioner[where id="id1] = {incoming updated referencedGeneralPractitioner}.

假设 incoming updated refenrencedGeneralPractitioner} 是:

{
   "resourceType":"practitioner",
   "id":"id1",
   "cachedIdentifier":[
      {
         "system":{
            "value":"urn:oid:1.3.6.1.4.1.19126.3"
         },
         "value":{
            "value":"INCOMING"
         }
      }
   ]
}

之后,我需要patient collection:

{
   "_id":"d283015f-91e9-4404-9202-093c28d6a931",
   "referencedGeneralPractitioner":[
      {
         "resourceType":"practitioner",
         "id":"id1",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"INCOMING"
               }
            }
         ]
      }
   ]
},
{
   "_id":"df342343-45d5-cf4a-8374-17dc436d40ca",
   "referencedGeneralPractitioner":[
      {
         "resourceType":"practitioner",
         "id":"id1",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"INCOMING"
               }
            }
         ]
      },
      {
         "resourceType":"practitioner",
         "id":"id2",
         "cachedIdentifier":[
            {
               "system":{
                  "value":"urn:oid:1.3.6.1.4.1.19126.3"
               },
               "value":{
                  "value":"48596705T"
               }
            }
         ]
      }
   ]
}

有什么想法吗?

简单 $updatearrayFilters

db.collection.update({
  "referencedGeneralPractitioner.id": "id1"
},
{
  $set: {
    "referencedGeneralPractitioner.$[elem]": {
      "resourceType": "practitioner",
      "id": "id1",
      "cachedIdentifier": [
        {
          "system": {
            "value": "urn:oid:1.3.6.1.4.1.19126.3"
          },
          "value": {
            "value": "INCOMING"
          }
        }
      ]
    }
  }
},
{
  "multi": true,
  "arrayFilters": [
    {
      "elem.id": {
        $eq: "id1"
      }
    }
  ]
})

mongoplayground