gpt4 book ai didi

mongodb - map[string]interface{} 自切换到新的 go mongo 驱动程序后未被正确解析

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:43 25 4
gpt4 key购买 nike

我正在切换到新的 mongo go 驱动程序 (mongo-go-driver),远离 mgo

尽管解码方法没有改变(变成 map[string]interface{}),但我们的一个函数不再工作

我相信正在发生的事情是返回的数据没有作为 map[string] 接口(interface)正确处理{}

摄取的数据是一个 mongo 聚合查询:

result = map[query_key:procedure_on_cities query_type:run procedure query_value:map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats] _id:ObjectID("5c5410fac2a7b1b1beae52bc")]

我们需要做的是将聚合中的 £ 替换为 $ 以使其正确运行(我们最初将 $ 编码为 £ 以避免在查询时遇到 $ 被错误解释的问题在前端放在一起

以前使用 mgo,我们只是这样做:

if returnedQuery, ok := result["query_value"].(map[string]interface{}); ok {
queryToRun = replace£With$(returnedQuery)
}

但这不再有效...

所以我们想要作为 map[string] 接口(interface)处理以传递给函数的位是这样的:

query_value:map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats] 

我们假设,就像使用 mgo 一样,我们可以做前面提到的类型断言

在我的测试中,我将要替换的带有 £ 的部分隔离开来:

result2 = result["query_value"].(map[string]interface{})

然后我想检查数据类型以及聚合中的内容是否是一个映射[字符串]接口(interface){}

    for key, value := range result2 {

fmt.Println("key from result2:", key, " || ", "value from result 2:", value)

if key == "aggregate" {

fmt.Println("FOUND AGGREGATE || ", "value:", value, " || type: ", reflect.TypeOf(value))

}
if valueMSI, ok := value.([]interface{}); ok {
fmt.Println("Please, print this", keyMSI)
}
}

但这不会打印最后一条语句。为什么?!这就是 result2 的内容:

result2 = map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats]

这是一个 []interface{} 不是吗?!它应该打印该语句,因为聚合键的关联值是一个包含映射的数组

执行类型检查时的响应是:

primitive.A 

primitive.A 不被视为[]接口(interface){}吗?

最佳答案

这里的问题是新的 mongo 驱动程序使用原语。[]接口(interface){}

的数据类型

primitive.A 具有 []interface{} 的基础数据类型,但类型文字是 primitive.A

要解决这个问题,你首先需要对 primitive.A 进行类型断言,然后转换为 literal[]interface{} 类型:

我已经导入了 bson primitive 的包,名称为:

import (
bsonNewGoDriverPrimitive "go.mongodb.org/mongo-driver/bson/primitive"
)

if valuePA, ok := value.(bsonNewGoDriverPrimitive.A); ok {
vI := []interface{}(valuePA)}

关于mongodb - map[string]interface{} 自切换到新的 go mongo 驱动程序后未被正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55868859/

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