gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:43:00 25 4
gpt4 key购买 nike

使用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() 的第一个参数必须是静态类型map的值。

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

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

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

但是最好先声明 result为 map 片段:
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()手动删除它们。

关于mongodb - 从对象数组删除键值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61117709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com