Ваша схема неверна.Если вам нужен массив, вы должны определить его как таковой, а не сделать его картой (каковым он является на данный момент, поскольку ваши индексы массива фактически являются ключами).
Преобразовать в массив:
{
"_id": ObjectId("4f41a5c7c32810e404000000"),
"albums": [
{
"_id": ObjectId("4f545d1bc328103812000000"),
"name": "album1"
},
{
"_id": ObjectId("4f545f56c328103c12000000"),
"name": "album2"
},
{
"_id": ObjectId("4f545f68c328103012000000"),
"name": "album3"
},
{
"_id": ObjectId("4f546642c328103c12000001"),
"name": "album4"
}]
}
А затем обновить с помощью позиционного оператора:
db.col.update({'albums._id':..}, {$set:{'albums.$.name':"My Album"}})
Обратите внимание, что использование _id во встроенном элементе в лучшем случае сбивает с толку.