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

时间:2017-08-03 06:22:13

标签: mongodb go mongodb-query mgo

我有以下mongodb(3.4.x)文档,我使用mgo驱动程序在golang中编码

{
"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"
        }
    }
]

}

我知道消息的价值。$。toQueue.id,我想在相关的toQueue数组项中更新status.id。

我试着这样做:

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)

但不允许多个$。没有它也不可更新。

有没有办法只更新我在查询中找到的子文档?

1 个答案:

答案 0 :(得分:0)

Neil Lunn给出了正确的答案。 我不可能像我尝试的那样使用嵌套数组。他也是对的,这个问题来自于设计错误。 所以我改变了它,Markus W Mahlberg建议将toQueue部分移动到一个单独的集合中,并将messageId作为参考。