tbowden
tbowden

Reputation: 1058

Updating a nested Array in using UpdateOne()

I'm having an issue updating a nested Array in a document. Reading around the topic i've come across various method, one that i've tweaked below, however nothing seems to work for me!

I'm trying to update the field systemUpdate_DT which is in a parent Array called List and a child array called customData. I'm referring to the object in the child array using the key _id of the parent array and key field_id in the child array.

How do I update the systemUpdate_DT of the respective object?

Live Example: https://mongoplayground.net/p/453OFPOQqBp

A document in the collection looks like:

[
  {
    "_id": "6032a5ad80443334a35f2232",
    "List": [
      {
        "_id": "6032a5af80443334a35f2234",
        "customData": [
          {
            "_id": "6032a5bc80443334a35f223c",
            "systemUpdate_DT": null,
            "field_id": "6032a5bc80443334a35f223b"
          },
          {
            "_id": "6032a5c280443334a35f223e",
            "systemUpdate_DT": null,
            "field_id": "6032a5c280443334a35f223d"
          }
        ]
      },
      {
        "_id": "6032a5b080443334a35f2236",
        "customData": [
          {
            "_id": "6032a5bc80443334a35f223c",
            "systemUpdate_DT": null,
            "field_id": "6032a5bc80443334a35f223b"
          },
          {
            "_id": "6032a5c280443334a35f223e",
            "systemUpdate_DT": null,
            "field_id": "6032a5c280443334a35f223d"
          }
        ]
      }
    ]
  }
] 

My Update Query looks like:

db.collection.updateOne({
        {
      "List._id": mongodb.ObjectId("6032a5af80443334a35f2234"),
      "List.customData.field_id": mongodb.ObjectId("6032a5bc80443334a35f223b")
    },
    {
      $set: {
        "List.$.customData.systemUpdate_DT": 'updatedDTTM'
    }
})

Upvotes: 1

Views: 2509

Answers (1)

felix
felix

Reputation: 9285

As there's two nested arrays in your document, you can't set the field with classic positional operator '$'.

Instead, you should use the arrayFilters option like this:

db.collection.update({
  "_id": ObjectId("6032a5ad80443334a35f2232")
},
{
  $set: {
    "List.$[list].customData.$[customData].systemUpdate_DT": "updatedDTTM"
  }
},
{
  "multi": false,
  "upsert": false,
  arrayFilters: [
    {
      "list._id": {
        "$eq": ObjectId("6032a5af80443334a35f2234")
      }
    },
    {
      "customData._id": {
        "$eq": ObjectId("6032a5bc80443334a35f223c")
      }
    }
  ]
})

try it online: mongoplayground.net/p/fb_86rNUKvt

Upvotes: 2

Related Questions