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} ] } )