Golang Go语言中mgo如何在运行的时候动态指定需要返回的哪些字段?
在 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
可以看看 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
方法。例如,假设你有一个用户集合,并且你只想返回用户的_id
和name
字段,可以这样做:
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和用法可能有所不同。