由于切换到新的go mongo驱动程序,

时间:2019-04-26 13:37:14

标签: mongodb go hashmap

我要从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 

是原始语言。不被视为[]接口{}吗?

1 个答案:

答案 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)}