简体   繁体   中英

Update Value on Multi-dimensional Array?

I would like to update destinos.origenes.base_price based on destinos.ciudad_id and destinos_origenes.ciudad_id, so far this is what I am been doing witouth success:

        //
        $updateResult2 = $coll_rutas->updateOne(

           /* CONDITION */
            [
                "_id" => new \MongoDB\BSON\ObjectId($ruta_id),
                "destinos.ciudad_id" => 1, // for morelia, mich
                "destinos.origenes.ciudad_id" => 122 // for selma, ca
            ],

            /* update */
            [
                '$set' => [
                    'destinos.$[].origenes.$[].base_price' => $destino_origen_amount
                ]
            ]

        );

This is the mongo object:

{
    "id": "5e27ee3e09558a0570003132",
    "nombre": "THE RUTA"    
    "clave": "TR",
    "descripcion": null,
    "active": true,
    "destinos": [
        {
            "ciudad_id": "1",
            "nombre_destino": "Morelia, Mich",
            "orden": "1",
            "notas": null,
            "origenes": [
                {
                    "ciudad_id": "12",
                    "nombre_origen": "Tlaltenango, Zac",
                    "orden": "1",
                    "notas": null,
                    "base_price": "666.66"
                },
                {
                    "ciudad_id": "30",
                    "nombre_origen": "Camargo, Chih",
                    "orden": "2",
                    "notas": null,
                    "base_price": "666.66"
                },
                {
                    "ciudad_id": "122",
                    "nombre_origen": "Selma, Ca",
                    "orden": "3",
                    "notas": null,
                    "base_price": "666.66"
                }
            ]
        },
        {
            "ciudad_id": "2",
            "nombre_destino": "Zamora, Mich",
            "orden": "2",
            "notas": null,
            "origenes": [
                {
                    "ciudad_id": "12",
                    "nombre_origen": "Tlaltenango, Zac",
                    "orden": "1",
                    "notas": null,
                    "base_price": "666.66"
                },
                {
                    "ciudad_id": "30",
                    "nombre_origen": "Camargo, Chih",
                    "orden": "2",
                    "notas": null,
                    "base_price": "666.66"
                },
                {
                    "ciudad_id": "122",
                    "nombre_origen": "Selma, Ca",
                    "orden": "3",
                    "notas": null,
                    "base_price": "666.66"
                }
            ]
        }
    ]
}

在此处输入图片说明 在此处输入图片说明

在此处输入图片说明

With arrayFilters works fine, I tested with your object example.

db.getCollection('temp').update({}, {
    $set: {
      "destinos.$[d].origenes.$[o].base_price":450
    },
    }, { 
      arrayFilters: [
        {
           "d.ciudad_id": "1",
        },
        {
           "o.ciudad_id": "122"
        }
      ]
})

在此处输入图片说明

在此处输入图片说明

And check this: https://www.php.net/manual/es/mongodb-driver-bulkwrite.update.php because arrayFilter is an element in the options.

[
    "_id" => new \MongoDB\BSON\ObjectId($ruta_id)
],
[
    '$set' => [
        "destinos.$[d].origenes.$[o].base_price" => 450
    ]
],
[
    "arrayFilters" => 
    [
        ["d.ciudad_id" => "1"],["o.ciudad_id" => "122"]
    ]
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM