使用mgo的非结构化MongoDB集合

kwo*_*lfe 20 go mgo

我是Go的新手.从我在mGo示例中看到的情况来看,为了查询集合然后从中读取,您必须预先定义将在结构中返回的数据.

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Timestamp time.Time
}
Run Code Online (Sandbox Code Playgroud)

在PHP中,文档被分配给一个数组.这是完美的,因为一个记录可能有完全不同的密钥集(可能不包含名称或电话,但包含电子邮件),我可以直接访问它而无需设置预定义的类/结构/变量.

有没有办法在Go/mGo中做同样的事情?

Gus*_*yer 47

有多种方法可以解决这个问题.

使用地图:

var m bson.M
err := collection.Find(nil).One(&m)
check(err)
for key, value := range m {
    fmt.Println(key, value)
}
Run Code Online (Sandbox Code Playgroud)

请注意,就mgo而言,bson.M并没有什么特别之处.它只是一种map[string]interface{}类型,您可以定义自己的地图类型并将其与mgo一起使用,即使它们具有不同的值类型.

使用文档切片:

bson.D是内部称为成MgO的切片,并且它的存在既能够提供更为有效的机制,并提供了一种方法以保留密钥的排序,这是在某些情况下使用的MongoDB(例如,定义当索引).

例如:

var d bson.D
err := collection.Find(nil).One(&d)
check(err)
for i, elem := range d {
    fmt.Println(elem.Name, elem.Value)
}
Run Code Online (Sandbox Code Playgroud)

使用内联映射字段

,inlineBSON 标志也可以在地图领域中使用,这样就可以有你的蛋糕和熊掌兼得.换句话说,它允许使用结构,以便操作已知字段很方便,同时允许通过内联映射处理未知字段.

例如:

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Extra     bson.M `bson:",inline"`
}
Run Code Online (Sandbox Code Playgroud)