登录
首页 >  Golang >  Go问答

从对象数组中删除键值时出现错误

来源:stackoverflow

时间:2024-02-21 11:54:23 158浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《从对象数组中删除键值时出现错误》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

使用 go 从 json 对象数组中删除键时,出现以下错误。 错误:

repository/orderrepository.go:394:11: first argument to delete must be map; have interface {}
    repository/orderrepository.go:395:11: first argument to delete must be map; have interface {}
    repository/orderrepository.go:396:11: first argument to delete must be map; have interface {}
    repository/orderrepository.go:397:11: first argument to delete must be map; have interface {}
    repository/orderrepository.go:398:11: first argument to delete must be map; have interface {}

我在下面解释我的代码。

func SyncOrders() map[string]interface{} {
        logger.Log.Println("OrderRepository SyncOrders Begin")
        resourceManager := resources.ResourceManager{}
        session, error := driver.Connect()
        db := session.DB(config.Configuration.Database)
        var resp map[string]interface{}

        if error != nil {
            resp := utils.Message(resourceManager.GetProperty(constants.ERROR), resourceManager.GetProperty(constants.DB_SERVER_NOT_REACHABLE_CODE), resourceManager.GetProperty(constants.DB_SERVER_NOT_REACHABLE_DESC))
            return resp
        } else {
            var result []interface{}
            //filter := bson.M{"Customer.CustomerID": id, "PaymentDetails.PaymentStatus": "Payment Received"}
            //fmt.Println(filter)
            err := db.C(ORDERCOLLECTION).Find(nil).All(&result)
            if err == nil {
                resp = utils.Message(resourceManager.GetProperty(constants.SUCCESS), resourceManager.GetProperty(constants.PRODUCT_GETBYID_CODE), resourceManager.GetProperty(constants.PRODUCT_GETBYID_DESC))
                for i := 1; i < len(result); i++ {

                    delete(result[i],"_id");
                    delete(result[i],"CreatedAt");
                    delete(result[i],"CreatedBy");
                    delete(result[i],"UpdatedAt");
                    delete(result[i],"UpdatedBy");
                }
                resp["data"] = result
            } else {
                //fmt.Println(err)
                resp = utils.Message(resourceManager.GetProperty(constants.ERROR), resourceManager.GetProperty(constants.PRODUCT_GETBYID_NOTFOUND_CODE), resourceManager.GetProperty(constants.PRODUCT_GETBYID_NOTFOUND_DESC))
            }
            defer session.Close()
            return resp
        }
    }

这里我从 mongodb 中获取一些记录,并从每条记录中删除一些键值,但是当我运行服务器时,我收到这些错误。因为我是 go 初学者。有人可以帮我解决这些错误吗?


解决方案


错误消息说明了一切:内置 delete() 的第一个参数必须是静态类型映射的值。

您的 result 变量的类型为 []interface{},因此像 result[i] 那样对其进行索引将产生 interface{} 类型的值。

如果它有地图,您可以使用type assertion从中获取地图值。由于您使用 mgo 驱动程序,因此它的类型为 bson.M(这是一个 map[string]interface{}),因此您可以这样做:

delete(result[i].(bson.m), "_id")

但是如果您首先将 result 声明为地图的切片会更好:

var result []bson.m

因此不需要类型断言,以下将是有效的代码:

delete(result[i], "_id")

另请注意,如果您想从结果中删除这些属性,最好告诉 mongodb 您不需要这些字段,这样服务器就不会发送这些字段(节省网络流量),然后您不必删除它们(节省时间和内存)。

使用投影告诉您不需要这些字段。在mgo中,您可以使用Query.Select()方法设置投影。

例如:

err := db.c(ordercollection).find(nil).select(bson.m{
    "_id":       0,
    "createdat": 0,
    "createdby": 0,
    "updatedat": 0,
    "updatedby": 0,
}).all(&result)

上述查询将导致文档中列出的字段不存在,因此您不必使用 delete() 手动删除它们。

您正在尝试从变量中删除键类型为 interface{}。 @icza 提供了一个很好的解决方案。

您可以使用 .select() 选择应检索结果的哪些字段。 那么您不需要从每个对象中删除这些字段。

例如,以下查询将仅检索姓名和年龄字段:

err := db.C(ORDERCOLLECTION).Find(nil).Select(bson.M{"name": 1, "age": 1}).All(&result)

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>