Mongo DB updating parts of object

To update the document in multi-level nested array, you need $[<identifier>] filtered positional operator and arrayFilters.

And the processes and processes.steps.stepId filter in the match operator can be removed as the filter is performed in arrayFilters.

db.collection.update({
  "name": "flow1"
},
{
  $set: {
    "processes.$[process].steps.$[step].status": "RUNNING"
  }
},
{
  arrayFilters: [
    {
      "process.processId": "firstProcessId"
    },
    {
      "step.stepId": "foo"
    }
  ]
})

Sample Mongo Playground


Reference

Update Nested Arrays in Conjunction with $[]


As you mentioned it does not work with multiple arrays, straight from the docs:

The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value

I recommend you use arrayFilters instead, it's behavior is much clearer especially when working with nested structures:

db.collection.updateMany(
{
  "name": "flow1",
  "processes.processId": "firstProcessId",
  "processes.steps.stepId": "foo"
},
{
  $set: {
    "processes.$[process].steps.$[step].status": "RUNNING"
  }
},
{
  arrayFilters: [
    {
      "process.processId": "firstProcessId"
    },
    {
      "step.stepId": "foo"
    }
  ]
})

Mongo Playground