2014-06-06 9 views
0

J'ai modélisé une relation has-many dans MongoDB avec un groupe ayant un tableau d'étudiants comme l'un des champs.Comment appliquer une fonction de mise à jour à tous les documents d'une collection dans MongoDB (en utilisant mgo)?

Lorsqu'un étudiant est supprimé, je souhaite passer en revue tous les groupes, et pour chaque groupe qui contient le programme deleted_student dans son groupe .Students, supprimez l'étudiant deleted_student du tableau. Pour supprimer l'élément deleted_student du tableau, j'ai une fonction d'aide, RemoveItem que je voudrais utiliser.

Quelle est la méthode "Mongo" pour appliquer cette fonction à tous les enregistrements d'une collection? Ou devrais-je simplement retourner tous les groupes, puis parcourir chacun d'entre eux et effectuer l'opération sur le terrain. Quelque chose comme ça (en Go en utilisant la bibliothèque MGO)

groups := conn.C("groups") 
allGroups := groups.Find() 
for _, group := range allGroups { 
    group.Students = RemoveItem(id, group.Students) 
} 

// Helper function that removes a mgo.DBRef from an array of mgo.DBRefs based on ID string 
func RemoveItem(objectId string, array []mgo.DBRef) []mgo.DBRef { 
    updatedArray := []mgo.DBRef{} 
    for _, item := range array { 
     if item.Id != objectId { 
      updatedArray = append(updatedArray, item) 
     } 
    } 
    return updatedArray 
} 

Répondre

0

Je crois qu'il est toujours pas possible de faire une seule opération à mettre à jour des éléments de sélection dans un tableau en fonction de critères. Cependant, vous pouvez limiter vos résultats un peu avant de commencer votre itération.

groupsToBeUpdated := groups.Find(bson.M{"students": bson.M{"$elemMatch": bson.M{"deleted_student": true}}}) 

De là, vous pouvez itérer, mais j'injecterait votre ressource db dans la méthode RemoveItem afin qu'il puisse faire la mise à jour là-bas. Cela vous permet de mettre à jour simultanément les documents. Voir mon point essentiel ici pour un exemple de travailleur: https://gist.github.com/KyleWolfe/7c54018a9ed16517c0dd ou aire de jeux: http://play.golang.org/p/njtAALaH1t

Edit: De plus, si vous aviez une interface mise en place qui a également occupé votre ressource db, alors vous pourriez avoir une méthode de RemoveStudents(). Tout ce dont cette méthode aurait besoin serait accessible à travers votre structure du groupe.

Questions connexes