You can only use the $
positional operator for single-level arrays. In your case, you have a nested array (heros
is an array, and within that each hero has a spells
array).
If you know the indexes of the arrays, you can use explicit indexes when doing an update, like:
> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});