为了账号安全,请及时绑定邮箱和手机立即绑定

使用 mgo 的非结构化 MongoDB 集合

使用 mgo 的非结构化 MongoDB 集合

Go
九州编程 2021-06-23 18:07:09
我对 Go 很陌生。从我在 mGo 的例子中看到的,为了查询一个集合然后从中读取,你必须预先定义将在结构中返回的数据。type Person struct {    ID        bson.ObjectId `bson:"_id,omitempty"`    Name      string    Phone     string    Timestamp time.Time}在 PHP 中,文档被分配给一个数组。这是完美的,因为一个记录可能有一组完全不同的键(可能不包含姓名或电话,但包含电子邮件),我可以直接访问它而无需设置预定义的类/结构/变量。有没有办法在 Go / mGo 中做同样的事情?
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

您可以将所有内容存储在地图中。该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))

通常,您为要处理的每种类型的文档(即,一种类型用于“用户”,另一种用于“博客文章”等)定义一种结构类型,其中包含您可能想要访问的每个属性。如果您的用户文档碰巧没有分配电子邮件地址,您在解码时只会得到一个空字符串(或更一般地说,零值)。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信