我是新来的.从我在mGo示例中看到的情况来看,为了查询一个集合并从中读取,必须预定义将在 struct 中返回的数据.

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

在PHP中,文档被分配给一个array.这很完美,因为一个记录可能有完全不同的键集(可能不包含姓名或电话,但包含邮箱),并且我可以直接访问它,而无需设置预定义的类/ struct /变量.

在GO/MGO中有没有办法做到这一点?

推荐答案

有多种方法可以处理这个问题.

Using a map:

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{}类型,你可以定义你自己的 map 类型,并与mgo一起使用,即使它们有不同的值类型.

Using a document slice:

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)
}

Using an ,inline map field

,inlineBSON flag也可以在 map 领域使用,这样你就可以兼得你的蛋糕和吃的了.换句话说,它支持使用 struct ,以便方便地操作已知字段,同时允许通过内联映射处理未知字段.

例如:

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

Go相关问答推荐

使用恶意软件 scanner (ClamAV)时的Google云存储桶上传文件验证

消费者在NAT中是如何实现的

如何使用工作区方法扩展克隆的Golang库

在整个SQL事务中将使用上下文作为默认设置吗?

如何在Golang中覆盖404

如何使用 Go 连接到非默认 firestore 数据库?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

有没有办法在 Golang 中使用带有 go-simple-mail lib 的代理?

为什么docall在singleflight中使用go panic?

我无法使用反向代理更改主机标头

如何将整数哈希细分为范围

Go gmail api 快速入门导致本地主机拒绝连接 ERR_CONNECTION_REFUSED

在 go 中将运行命令的标准输出发送到其标准输入

如何在 GORM 中获取字段值

Go AST:获取所有 struct

有没有办法在一个 goroutine 返回后延迟后取消上下文?

如何从 docker-compose 命令运行 2 个不同的命令:

将基本 HTTP AUth 用户/密码凭据存储在 GO 中,无需外部包

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?