我已经在MongoDB中建立了一个有多个关系的关系,其中一个Group将一组学生作为其中一个字段。
当删除学生时,我想浏览所有组,并且对于在其Group.Students中具有deleted_student的每个组,从数组中删除deleted_student。
要从数组中删除deleted_student,我有一个帮助函数,我可以使用的RemoveItem。
" Mongo"是什么?将此函数应用于集合中的所有记录的方法?或者我应该只返回所有组,然后遍历每个组并对该字段执行操作。这样的事情(在使用mgo库的Go中)
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
}
答案 0 :(得分:0)
我认为仍然无法根据条件执行单个操作来更新阵列中的选择元素。但是,您可以在开始迭代之前稍微限制一下结果。
groupsToBeUpdated := groups.Find(bson.M{"students": bson.M{"$elemMatch": bson.M{"deleted_student": true}}})
从这里你可以迭代,但是我会将你的db资源注入RemoveItem方法,以便它可以在那里进行更新。这允许您同时更新文档。请在此处查看我的要点以获取工作人员示例:https://gist.github.com/KyleWolfe/7c54018a9ed16517c0dd或在操场上:http://play.golang.org/p/njtAALaH1t
编辑:此外,如果您设置的接口也保存了您的数据库资源,那么您可以使用RemoveStudents()方法。可以通过Group结构访问该方法所需的所有内容。