我正在使用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
复制相似问题