从对象数组中删除键值时出错
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)
我在使用 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)