Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 当primitive.a是bson[]接口时,如何将mongo go驱动程序的输出作为bson数组反序列化到[]接口{}中_Mongodb_Go_Bson - Fatal编程技术网

Mongodb 当primitive.a是bson[]接口时,如何将mongo go驱动程序的输出作为bson数组反序列化到[]接口{}中

Mongodb 当primitive.a是bson[]接口时,如何将mongo go驱动程序的输出作为bson数组反序列化到[]接口{}中,mongodb,go,bson,Mongodb,Go,Bson,我有一个map[string]接口{},它是从使用新的mongo go驱动程序的mongo查询生成的 我想处理映射中的某些值,并替换属于聚合键的值中的字符 这是地图: result2 = map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats] 在地图中循环: for key, value := range result2 {

我有一个map[string]接口{},它是从使用新的mongo go驱动程序的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
但打印时它似乎是地图的[]接口{}?[见结果2]

记住这一点,为什么第二个if语句不进行计算?

这是否意味着原始。A!=接口数组

在文档中,类型A定义为“A表示BSON数组。此类型可用于以简明易读的方式表示BSON数组。通常在序列化为BSON时使用。对于反序列化,应使用RAWARRY或数组类型。”


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

您可以使用将
primitive.a
类型的值转换为
[]接口{}
,其形式为
T(x)

因此,在您的情况下,您可以这样做:

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

正如文档中所解释的,在任何情况下,您都可以将非常量值x转换为类型T(我已经为与您的问题相关的情况添加了重点):

  • x可分配给T
  • 忽略结构标记(见下文),x的类型和T具有相同的 基础类型。
  • 忽略结构标记(见下文),x的type和T是指针类型 未定义类型,且其指针基类型具有 相同的基础类型
  • x的类型和T都是整数或浮点类型
  • x型和T型都是复杂类型
  • x是一个整数或字节片段或符文,T是字符串类型
  • x是一个字符串,T是一个字节或符文片段

略加强调:

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

由于
基元.A
是使用类型literal
[]接口{}
定义的,因此它具有与
[]接口{}
相同的底层类型

  • []接口{}
    的基本类型是
    []接口{}
  • 基元.A的底层类型是
    []接口{}

为什么不使用
value.(primitive.A)
?@mkopriva我们正在使用函数将接收接口的$转换为$(因为它是一个范围超出此文件范围的包)。所以理想情况下,我们希望一切都能与之配合。。。“这是否意味着primitive.A!=接口数组?”
primitive.A
是接口的一部分,但它与
[]接口{}
的类型不同,这就是类型断言失败的原因。它们共享相同的内存布局,因此将一个转换为另一个很容易,就像
T(v)
一样。我明白你的意思,但我想问的是如何将primitive.A转换为[]接口{},因为它们在本质上是相似的