我要从mgo切换到新的mongo go驱动程序(mongo-go-driver)
尽管解码方法未更改(进入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]接口处理的位是:
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{})
然后我要检查数据类型以及聚合中的内容是否甚至是map [string] 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]
这是[]界面{},对吗?应该打印该语句,因为聚合键的关联值是包含映射的数组
执行类型检查时,响应为:
primitive.A
是原始语言。不被视为[]接口{}吗?
答案 0 :(得分:0)
这里的问题是新的mongo驱动程序使用了原语。[] interface {}的数据类型
primitive.A具有[] interface {} 的底层数据类型,但是类型文字是Primitive.A
要解决此问题,您首先需要对基本类型进行类型声明,然后再转换为类型literal [] interface {}:
我已经导入了名称为bson的软件包:
import (
bsonNewGoDriverPrimitive "go.mongodb.org/mongo-driver/bson/primitive"
)
if valuePA, ok := value.(bsonNewGoDriverPrimitive.A); ok {
vI := []interface{}(valuePA)}