Forum

Modificare array annidati mongodb

Ultimo aggiornamento più di 2 anni fa
Lorenzo-bonelli
più di 2 anni fa
Buongiorno a tutti, mi ritrovo a dover appunto modificare record contenuti in più array annidati. La collection è strutturata così:

{
        "_id" : ObjectId("56a7985b2403d111d7581af1"),
       ...,
       ...,
        "elementi_attivi" : {
                "strutture" : [
                        {
                                "_id" : ObjectId("56a79772d01cb398119f0806"),
                                "id" : 1,
                                "id_user" : 1,
                                ...,
                                ...,
                                ...,
                                "in_stiva" : [
                                        {
                                                "id" : 1,
                                                "q" : 50
                                        },
                                        {
                                                "id" : 2,
                                                "q" : 30
                                        },
                                        {
                                                "id" : 3,
                                                "q" : 7
                                        },
                                        ...
                                ],
                               ...
                                ],
                                "e_costruzione" : 150,
                                "costo" : 500
                        },
                        {
                                "id" : 56,
                                "nome" : "struttura a caso"
                        }
                ],
                "unita" : [ ]
        },
        "gruppi" : [ ],
        "progetti" : [ ],
        "assemblaggi" : [ ]
}


Il mio problema è che dovrei modificare la quantità di materiale in un elemento dell'array "in_stiva" dentro un elemento dell'array "strutture".

filtro = {
        'dati_personali.id':res_produzione[produzione].id_utente,
'elementi_prodotti.strutture':{$elemMatch:{'id':res_produzione[produzione].id_oggetto}},
'elementi_prodotti.strutture.in_stiva':{$elemMatch:{'id':res_produzione[produzione].id_materiale}},
};
valore = {
    $set:{
'q':nuova_quantita_materiale
    }
 }
SERVER.updateMongo('users',filtro,valore,function(err,res_update){
if(err){
SERVER.stampa(err);
}
        SERVER.stampa(res_update);
});

Dovrei utilizzare il "$"? Se sì, come? Non sono riuscito a capire come dare più di un "$elemMatch" nel filtro e richiamarlo nel parametro per l'update...
Cercando sulle varie guide e manuali non ho trovato niente.

Qualcuno sa aiutarmi? :)
Matteo
più di 2 anni fa

Ciao Lorenzo, io sono appena arrivato e forse sono il meno indicato nel risponderti.

Da quello che ho capito non c'è possibilità di modificare elementi di array embedded, ho lo stesso problema anche io e non ho trovato niente di utile.

Adesso volevo capire se poter utilizzare un altro approccio:

in pratica vorrei estrapolare (seguendo il tuo esempio) l'array "in_stiva", modificarlo e poi "ributtarlo" dentro con un $set


L'altra possibilità (che ha poi anche suggerito Alberto in un video) è quello di cambiare lo schema, ovvero l'array "in_stiva" lo estrapoli e lo metti in un'altra collection (ovviamente col riferimento all'id della "strutture".

Insomma, solo idee e nulla di concreto. Se qualcuno ha qualche linea di codice da proporre ne saremmo contenti!!


Matteo

Mik
più di 2 anni fa

ciao Lorenzo,

non so se l'hai risolto ma la query dovrebbe essere questa:

db.tuaCollezione.update( {"_id": "iddiDocumento" },
    {$set: { "elementi_attivi.strutture.0.in_stiva.0.id" :  88 }}  
)

ovviamente ci devi mettere l'id del documento che intendi modificare.

Stai attento che:

 "elementi_attivi.strutture.0" fa riferimento al primo elemento dell' array  "strutture"

"in_stiva.0"  fa riferimento al primo elemento dell'array in "in_stiva"


fammi sapere