在mgo中更新多个数组中的单个子文档

I have following mongodb (3.4.x) document, i code in golang with mgo driver

{
"id": "5981d4c2795a1b4a801ee027",
"scenarioId": "59804b10d8ee910085e33865",
"messages": [
    {
        "id": "5981d4c2795a1b4a801ee028",
        "toQueue": [
            {
                "id": "5981d4c2795a1b4a801ee029",
                "to": {
                    "email": "some@email.com"
                },
                "channel": "EMAIL",
                "toType": "EMAIL",
                "status": {
                    "id": 1,
                    "groupId": 1,
                    "groupName": "PROCESSING",
                    "name": "APPROVED",
                    "description": "MessageChain approved for processing"
                }
            },
            {
                "id": "5981d4c2795a1b4a801ee02a",
                "to": {
                    "phone": "+381631891245"
                },
                "channel": "SMS",
                "toType": "PHONE",
                "status": {
                    "id": 1,
                    "groupId": 1,
                    "groupName": "PROCESSING",
                    "name": "APPROVED",
                    "description": "MessageChain approved for processing"
                }
            }
        ],
        "status": {
            "id": 1,
            "groupId": 1,
            "groupName": "PROCESSING",
            "name": "APPROVED",
            "description": "MessageChain approved for processing"
        }
    },
    {
        "id": "5981d4c2795a1b4a801ee02b",
        "toQueue": [
            {
                "id": "5981d4c2795a1b4a801ee02c",
                "to": {
                    "phone": "+123456789"
                },
                "channel": "SMS",
                "toType": "PHONE",
                "status": {
                    "id": 1,
                    "groupId": 1,
                    "groupName": "PROCESSING",
                    "name": "APPROVED",
                    "description": "MessageChain approved for processing"
                }
            }
        ],
        "status": {
            "id": 1,
            "groupId": 1,
            "groupName": "PROCESSING",
            "name": "APPROVED",
            "description": "MessageChain approved for processing"
        }
    }
],
"messageStages": [
    {
        "id": "5981d4c2795a1b4a801ee033",
        "validityPeriod": 5,
        "validityPeriodTimeUnit": "MINUTES",
        "providerId": 5,
        "email": {
            "text": "this is the email text",
            "subject": "and here the email subject"
        },
        "status": {
            "id": 1,
            "groupId": 1,
            "groupName": "PROCESSING",
            "name": "APPROVED",
            "description": "MessageChain approved for processing"
        }
    }
]

}

and I know the value of messages.$.toQueue.id, where i want to update status.id in the related toQueue Array Item.

I tried to do it that way:

query = bson.M{
    "messages.toQueue._id": toQueueId,
}

update = bson.M{
    "$set": bson.M{
        "messages.$.toQueue.$.status.id": status.Id,
        "messages.$.toQueue.$.status.name": status.Name,
        "messages.$.toQueue.$.status.groupId": status.GroupId,
        "messages.$.toQueue.$.status.groupName": status.GroupName,
        "messages.$.toQueue.$.status.description": status.Description,

    },
}
err = cr.Update(query,update)

but multiple $ are not allowed. Without it's also not updateable.

Is there any way to update only the subdocument, which i found in query ?

Neil Lunn gave the right answer. It's not possible to work with nested arrays the way I tried to do. And he is also right, that problem is coming from design mistake. So I changed it as him and Markus W Mahlberg suggested to move the toQueue part in a separate collection, with messageId as a reference.