Home > Net >  mongoDB: update nested array element
mongoDB: update nested array element

Time:12-22

I have the following datastructure

{
_id: ObjectId('61ae12bfb8047effd0ac2a01'),
data: [
    {
        xml: {
            messageId: 1638798015073,
            xmlString: 'someXML'
        },
        data: [
            {
                customerId: 123456,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58c141b12dcdd5eb0',
                        writtenBack: false
                    }
                ]
            },
            {
                customerId: 55555,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58b143ef38c016217',
                        writtenBack: true
                    }
                ]
            }
        ]
    },
    {
        xml: {
            messageId: 1638798015094,
            xmlString: 'someXML'
        },
        data: [
            {
                customerId: 55555,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58c1416129062c2d2',
                        writtenBack: false
                    },
                    {
                        objectId: 'PA1106:zt:b8be9ea04011c2a18c148a0d4c9d6aab',
                        writtenBack: true
                    }
                ]
            },
        ]
    },
],
createdAt: '2021-12-06T13:40:15.096Z',
createdBy: 'Test'
}

Now I want to update the writtenBack property of for a given Document and objectId. How would I write a query for this?

my updateOne looked like this

            {
                _id: '61ae12bfb8047effd0ac2a01',
                'data.data.docs.objectId': 'PA1106:zt:bb302216879669b58b143ef38c016217'
            },

            {
                $set: { 'data.data.docs.$.writtenBack': true }
            }

I know there is arrayFilters for nested arrays, but as far as I know, I need a unique identifier for each array-Level. But I only have the objectId which is unique for a Document. Any Ideas?

CodePudding user response:

Yes, you can achieve the update for the document in the nested array with positional operator $[] and arrayFilters.

db.collection.update({
  _id: "61ae12bfb8047effd0ac2a01",
  
},
{
  $set: {
    "data.$.data.docs.$[doc].writtenBack": true
  }
},
{
  arrayFilters: [
    {
      "doc.objectId": "PA1106:zt:bb302216879669b58b143ef38c016217"
    }
  ]
})

Sample Mongo Playground

CodePudding user response:

I made it work with this query

            {
                _id: '61ae12bfb8047effd0ac2a01',
            },
            {
                $set: { 'data.$[elem1].data.$[elem2].docs.$[elem3].writtenBack': true }

            },
            {
                arrayFilters: [
                    { 'elem1.xml.messageId': 1638798015094 },
                    { 'elem2.customerId': 55555},
                    { 'elem3.objectId': 'PA1106:zt:bb302216879669b58c1416129062c2d2'}]
            }
  • Related