Golang Go语言中mgo如何在运行的时候动态指定需要返回的哪些字段?

发布于 1周前 作者 zlyuanteng 来自 Go语言

在 Go 语言中使用 mgo 的时候,一般需要先定义一个 Struct,例如:

type PrivacyInfo struct {
	Phone string        `bson:"phone"`
	Id    bson.ObjectId `json:"id" bson:"_id"`
}

这样就可以把_id 和 phone 都取出来。但是除了 phone 这一列外,还有可能取"_id"和"telephone"或者"_id"和"number"

需要取的数据是用户在程序运行的时候手动指定的。在这种情况下,应该如何才能只取需要的数据?


Golang Go语言中mgo如何在运行的时候动态指定需要返回的哪些字段?

更多关于Golang Go语言中mgo如何在运行的时候动态指定需要返回的哪些字段?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

可以看看 mgo 的 select

更多关于Golang Go语言中mgo如何在运行的时候动态指定需要返回的哪些字段?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题在于,拿到以后的数据,我如果用 bson.M 就会报错,用 bson.D 数据又不全


db := session.DB(“test”)
collection := db.C(“aaa”)
result := make(map[bson.ObjectId]interface{})
iter := collection.Find(nil).Iter()
for iter.Next(&result) {
fmt.Println(result)
}

在Golang中使用mgo(MongoDB Go Driver的一个早期版本,现在推荐使用官方的go.mongodb.org/mongo-driver/mongo)时,可以通过指定查询选择器(query selector)来动态地在运行时选择需要返回的字段。这种技术通常称为投影(projection)。

mgo中,你可以使用bson.M来构建一个选择器对象,并传递给查询的Select方法。例如,假设你有一个用户集合,并且你只想返回用户的_idname字段,可以这样做:

import (
    "labix.org/v2/mgo"
    "labix.org/v2/mgo/bson"
)

func getUserFields(session *mgo.Session, userId bson.ObjectId, fields []string) (User, error) {
    var user User
    query := bson.M{"_id": userId}
    selector := bson.M{}
    for _, field := range fields {
        selector[field] = 1
    }

    collection := session.DB("").C("users")
    err := collection.Find(query).Select(selector).One(&user)
    if err != nil {
        return User{}, err
    }
    return user, nil
}

注意,fields参数是一个字符串切片,包含了你想返回的字段名。在selector中,将这些字段的值设置为1表示包含这些字段。如果需要将某个字段排除在外,可以将其值设置为0

请注意,mgo已不再维护,建议迁移到官方的MongoDB Go驱动。官方驱动也支持类似的投影功能,但API和用法可能有所不同。

回到顶部