我正在使用Go和gqlgen访问我的mongoDB数据库,我想知道如何从数据库访问id字段?这就是我目前所拥有的,_id返回一个空字符串
type Post {
_id: ID!
title: String!
content: String!
comments: [Comment!]
author: User!
created: Date!
}
type Query {
post(_id: ID!): Post
...
}func (r *queryResolver) Post(ctx context.Context, id string) (*model.Post, error) {
var post model.Post
_id, err := primitive.ObjectIDFromHex(id)
if err != nil {
return nil, err
}
err = db.Posts.FindOne(context.TODO(), bson.D{{Key: "_id", Value: _id}}).Decode(&post)
if err != nil {
return nil, err
}
return &post, nil
}发布于 2021-08-20 16:09:40
gqlgen中的ID类型创建了一个字符串,但mongo中的_id可能是一个primitive.ObjectId,它可能会产生问题,这取决于您如何与mongo交互。
最好将bson标签设置为_id
考虑设置以下结构来覆盖gql生成的流。可以使用Hex()方法将id转换为字符串。
type Post struct{
ID primitive.ObjectID `bson:"_id" json:"id"`
title: string
content: string
comments: []Comment
author: User
created: time.Time
}如果_ids中有许多结构,您可能希望自动执行此操作。为了避免覆盖,您可以实现一个钩子来自动生成bson标记
type Post {
id: ID!
title: String!
content: String!
comments: [Comment!]
author: User!
created: Date!
}现在,在文件结构中创建一个名为"hooks“的新目录,并创建一个新文件"bson.go”
复制并粘贴以下内容
package main
import (
"fmt"
"os"
"github.com/99designs/gqlgen/api"
"github.com/99designs/gqlgen/codegen/config"
"github.com/99designs/gqlgen/plugin/modelgen"
)
func mutateHook(b *modelgen.ModelBuild) *modelgen.ModelBuild {
for _, model := range b.Models {
for _, field := range model.Fields {
name := field.Name
if name == "id" {
name = "_id"
}
field.Tag += ` bson:"` + name + `"`
}
}
return b
}
func main() {
cfg, err := config.LoadConfigFromDefaultLocations()
if err != nil {
fmt.Fprintln(os.Stderr, "failed to load config", err.Error())
os.Exit(2)
}
p := modelgen.Plugin{
MutateHook: mutateHook,
}
err = api.Generate(cfg,
api.NoPlugins(),
api.AddPlugin(&p),
)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(3)
}
}现在,在您的main.go中,将以下内容添加到顶部
//go:generate go run hooks/bson.go
现在,当你运行go generate时,gqlgen不仅会正常生成,还会为我们所有的模型添加bson标签。以及任何具有名称id的字段,以具有_id的bson标记
https://stackoverflow.com/questions/65659122
复制相似问题