猿问

使用 mgo 的非结构化 MongoDB 集合

我对 Go 很陌生。从我在 mGo 的例子中看到的,为了查询一个集合然后从中读取,你必须预先定义将在结构中返回的数据。


type Person struct {

    ID        bson.ObjectId `bson:"_id,omitempty"`

    Name      string

    Phone     string

    Timestamp time.Time

}

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


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


九州编程
浏览 165回答 2
2回答

精慕HU

您可以将所有内容存储在地图中。该mgo/bson包提供了bson.M一种可用于存储任意数据的数据类型,并且由于 MongoDB 不强制实施强模式,因此mgo在bson.M内部对所有内容使用该类型。如果你只是想显示数据,使用 abson.M应该没问题,但是一旦你想开始使用它,你应该考虑使用 struct 代替。否则,您的程序中将需要大量类型断言。例如,假设您想以result["title"]大写形式打印文档的标题 ( )。通过使用 just bson.M,您的代码将如下所示:// is there a title attribute?if title, ok := result["title"]; ok {    // is it a string? (and not another map or integer or something else)    if titleStr, ok := title.(string); ok {        // ok, it is a string        fmt.Println("Title: ", strings.ToUpper(titleStr))    }}当您允许mgo将数据转换为结构时,您的程序将变得更具可读性和更易于维护。然后,相同的代码可能读作:fmt.Println(strings.ToUpper(result.Title))通常,您为要处理的每种类型的文档(即,一种类型用于“用户”,另一种用于“博客文章”等)定义一种结构类型,其中包含您可能想要访问的每个属性。如果您的用户文档碰巧没有分配电子邮件地址,您在解码时只会得到一个空字符串(或更一般地说,零值)。
随时随地看视频慕课网APP

相关分类

Go
我要回答