MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mise à jour des tableaux imbriqués dans mongodb

Voici la grande question, avez-vous besoin de tirer parti des opérations "addToSet" et "push" de Mongo ? Si vous envisagez vraiment de modifier uniquement des éléments individuels dans le tableau, vous devriez probablement créer ces tableaux en tant qu'objets.

Voici comment je structurerais cela :

{
    id: 1,
    items: 
        { 
          "2" : { "blocks" : { "3" : { txt : 'hello' } } },
          "5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
        }
}

Cela transforme essentiellement tout en objets JSON au lieu de tableaux. Vous perdez la possibilité d'utiliser $push et $addToSet mais je pense que cela rend tout plus facile. Par exemple, votre requête ressemblerait à ceci :

db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})

Vous remarquerez également que j'ai vidé les "ID". Lorsque vous imbriquez des choses comme celle-ci, vous pouvez généralement remplacer "ID" en utilisant simplement ce numéro comme index. Le concept "ID" est désormais sous-entendu.

Cette fonctionnalité a été ajoutée en 3.6 avec des mises à jour expressives.

db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )