当primitive.A是bson [] interface时,如何将mongo-go-driver的输出作为bson数组反序列化为[] interface {}

时间:2019-04-26 15:12:01

标签: mongodb go bson

我有一个map [string] interface {},它是使用新mongo-go-driver的mongo查询生成的

我想处理地图中的某些值,并替换属于聚合键的值中的£字符

这是地图:

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

遍历地图:

    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("Working", valueMSI)
            fmt.Println(reflect.TypeOf(valueMSI))
        }
    }

现在,在检查聚合键的if语句中,第一个print语句的输出给出的类型为:

primitive.A

但是打印时似乎是地图的[]接口{}? [请参见result2]

请记住,为什么第二个if语句不被评估?

这是否意味着原始的!=接口数组?

在文档https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive中,类型A定义为“一个A代表一个BSON数组。该类型可用于简洁明了地表示一个BSON数组。通常在序列化为BSON时使用。对于反序列化,应使用RawArray或Array类型。“

我该怎么做?我要访问聚合键的值吗?

1 个答案:

答案 0 :(得分:2)

您可以使用 conversion expression primitive.A类型的值转换为[]interface{}。 >

因此,您可以这样做:

T(x)

如文档中所述,您可以在以下任何一种情况下将非恒定值x转换为类型T(对于与您的问题相关的情况,我特别强调):

  
      
  • x可分配给T。
  •   
  • 忽略结构标签(见下文), x的类型和T具有相同的含义   基础类型。
  •   
  • 忽略struct标记(见下文),x的类型和T是指针类型   不是定义的类型,它们的指针基类型有   相同的基础类型。
  •   
  • x的类型和T都是整数或浮点类型。
  •   
  • x的类型和T都是复数类型。
  •   
  • x是整数或字节或符文的一部分,T是字符串类型。
  •   
  • x是一个字符串,T是一个字节或符文切片。
  •   

underlying types上的一点点(添加了强调):

  

每个类型T都有一个底层类型:如果T是预先声明的类型之一   布尔,数字或字符串类型,或类型文字,   相应的基础类型是T本身。否则, T的基础   type是T在其类型中引用的类型的基础类型   声明。

由于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 pa, ok := value.(primitive.A); ok { valueMSI := []interface{}(pa) fmt.Println("Working", valueMSI) fmt.Println(reflect.TypeOf(valueMSI)) } } 是使用类型文字 primitive.A定义的,因此它具有与[]interface{}相同的底层类型

  • []interface{}的基础类型为[]interface{}
  • []interface{}的基础类型为primitive.A