Mongodb 当primitive.a是bson[]接口时,如何将mongo go驱动程序的输出作为bson数组反序列化到[]接口{}中
我有一个map[string]接口{},它是从使用新的mongo go驱动程序的mongo查询生成的 我想处理映射中的某些值,并替换属于聚合键的值中的字符 这是地图: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 {
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转换为[]接口{},因为它们在本质上是相似的