如何将更新功能应用于MongoDB中的集合中的所有文档(使用mgo)?

时间:2014-06-06 15:04:36

标签: mongodb go mgo

我已经在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
}

1 个答案:

答案 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结构访问该方法所需的所有内容。