Database

[{"_id":"sad445","year":2020,"grade":4,"seccion":"A","id":100,"name":"pedro","notes":[{"curse":5,"block":1,"score":{"a1":5,"a2":10,"a3":15},"total":50},{"curse":5,"block":2,"score":{"b1":10,"b2":20,"b3":30},"total":20}]},{"_id":"sad446","year":2020,"grade":4,"seccion":"A","id":100,"name":"pedro","notes":[{"curse":5,"block":1,"score":{"a1":5,"a2":10,"a3":15},"total":50}]},{"_id":"sad447","year":2020,"grade":4,"seccion":"A","id":100,"name":"pedro","notes":[]},{"_id":"sad448","year":2020,"grade":4,"seccion":"A","id":100,"name":"pedro"}]

Query

db.collection.update({},[{$set:{notes:{$function:{body:"function(notes) { var record = { curse:5, block:2, score:{ b4:40 } }; if(!notes || !notes.length) { return [record]; } var updated = false; for (var i=0; i < notes.length; i++) { if (notes[i].block == 2 && notes[i].curse == 5) { updated = true; notes[i].score.b4=40; break; } } if (!updated) notes.push(record); return notes; }",args:["$notes"],lang:"js"}}}}],{multi:true})

Result