0

我已经在 MongoDB 中建模了一个具有多个关系的组,该组具有一组学生作为字段之一。

当一个学生被删除时,我想遍历所有组,并且对于在其 Group.Students 中有 deleted_student 的每个组,从数组中删除 deleted_student。

要从数组中删除 deleted_student,我有一个辅助函数 RemoveItem,我想使用它。

将此功能应用于集合中所有记录的“Mongo”方式是什么?或者我应该只返回所有组,然后遍历每个组并在字段上执行操作。像这样的东西(在 Go 中使用 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
}
4

1 回答 1

0

我相信仍然不可能执行单个操作来根据标准更新数组中的选择元素。但是,您可以在开始迭代之前稍微限制您的结果。

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

从这里您可以迭代,但是我会将您的数据库资源注入到 RemoveItem 方法中,以便它可以在那里进行更新。这允许您同时更新文档。在这里查看我的要点以获取工人示例:https ://gist.github.com/KyleWolfe/7c54018a9ed16517c0dd或在操场上:http ://play.golang.org/p/njtAALaH1t

编辑:此外,如果您设置了一个还保存数据库资源的接口,则可以使用 RemoveStudents() 方法。该方法所需的一切都可以通过您的 Group 结构访问。

于 2014-06-06T15:26:33.093 回答