Puoi usare solo il $
operatore posizionale per array a livello singolo. Nel tuo caso, hai un array nidificato (heros
è un array, e al suo interno ogni eroe ha un spells
matrice).
Se conosci gli indici degli array, puoi utilizzare indici espliciti quando esegui un aggiornamento, come:
> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});