小编典典

使用mgo的非结构化MongoDB集合

go

我很新。从我在mGo的示例中所看到的,要查询一个集合然后从中读取,您必须预先定义将要返回到结构中的数据。

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Timestamp time.Time
}

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

在Go / mGo中有没有办法做到这一点?


阅读 299

收藏
2020-07-02

共1个答案

小编典典

您可以通过多种方式来处理此问题。

使用地图:

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

请注意,就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)
}

使用内嵌地图字段

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

例如:

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Extra     bson.M `bson:",inline"`
}
2020-07-02