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

问题描述 投票:0回答:1

使用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中获取一些记录,并从每个记录中删除一些键值,但是当我运行服务器时,却遇到了这些错误。因为我是初学者。有人可以帮助我解决这些错误吗?

mongodb dictionary go bson mgo
1个回答
2
投票

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

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

如果包含地图,则可以使用interface{}从中获取地图值。由于您使用的是type assertion驱动程序,因此它的类型为mgo(它是bson.M),因此您可以这样操作:

bson.M

但是如果首先将map[string]interface{}声明为地图片段,会更好:

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

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

result
© www.soinside.com 2019 - 2024. All rights reserved.