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

Getting error while deleting the key value from array of objects

我在使用 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 获取一些记录并从每条记录中删除一些键值但是当我在 运行 服务器时我收到这些错误。因为我是初学者。谁能帮我解决这些错误?

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

您的 result 变量属于 []interface{} 类型,因此像 result[i] 一样对其进行索引将导致 interface{}.

类型的值

如果它有一张地图,你可以使用type assertion to obtain the map value from it. Since you use the mgo driver, it is of type 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() 到 select 应为结果检索哪些字段。 然后你不需要从每个对象中删除这些字段。

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

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