`Para cada "lost user":` lostUsers.forEach(function(user){ `Buscas su home (que fue alterado)` *Aquí tengo duda si "user" es el id o es el objeto del usuario* var currentHome = db.home.findOne({userId:user}); `Buscas su home en el backup` var backedUpHome = db.homeBackup.findOne({userId:user}); `Buscas el mismo home del backup pero lo guardas en otra segunda variable` var restoredHome = db.homeBackup.findOne({userId:user}); `Si el home con "userId" no existe:` if(currentHome == null){ print("not found"); //No se registro, just update //Find in backup //db.home.update({userId:{$exists:false}},tojson(restoredHome)) //UNCOMMENT `Reemplazas el home inexistente por el home restaurado` db.home.save(restoredHome); `Si el home con "userId" existe:` }else{ print('found'); //Usuario se registro de nuevo (merge) `Reemplazas todos estos campos por los del home restaurado` var merge = { $set : { signUpDate : restoredHome.signUpDate, teamName : restoredHome.teamName, fanOf : restoredHome.fanOf, createdAt : restoredHome.createdAt, knockout : restoredHome.knockout, lineUpHistory : restoredHome.lineUpHistory, points : restoredHome.points, rankings : restoredHome.rankings, isRegistred : restoredHome.isRegistred, roundUpdates : restoredHome.roundUpdates, myAdminGroups : restoredHome.myAdminGroups } }; //Merge groups `Si hay grupos en el home existente:` if(currentHome.groups.length > 0){ // necessary?? currentHome.groups.forEach(function(group){ var found = false; restoredHome.groups.forEach(function(groupBackup){ if(String(group.groupId) == String(groupBackup.groupId)){ //print('group ' + group + " found"); found = true; } }); if(!found){ //print('group ' + group + " not found"); restoredHome.groups.push(group); } }); } `Reemplazas los grupos del home existente por los grupos del home restaurado más los que añadiste` merge.$set.groups = restoredHome.groups; //Merge groups g18 if(currentHome.groupsG18.length > 0){ // necessary?? currentHome.groupsG18.forEach(function(group){ var found = false; restoredHome.groupsG18.forEach(function(groupBackup){ if(String(group.groupId) == String(groupBackup.groupId)){ found = true; } }); if(!found){ restoredHome.groupsG18.push(group); } }); } `Reemplazas los grupos g18 del home existente por los grupos del home restaurado más los que añadiste` merge.$set.groupsG18 = restoredHome.groupsG18; //print(tojson(merge.$set.groups)); `Haces el update del home existente` *Aquí no falta { multi: true } ?* db.home.update({userId:user}, merge) //UNCOMMENT } //Save process `Buscas nuevamente el home con "userId"` var finalHome = db.home.findOne({userId:user}); `Y en el collection "mergeResult" guardas los tres homes, el alterado, el del backup y el restaurado junto con el "userId"` db.mergeResult.insert({ "userId" : user, "backedup" : backedUpHome, "messedUp" : currentHome, "merged" : finalHome }) })