首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用gqlgen从mongoDB获取_id

使用gqlgen从mongoDB获取_id
EN

Stack Overflow用户
提问于 2021-01-11 06:18:30
回答 1查看 282关注 0票数 0

我正在使用Go和gqlgen访问我的mongoDB数据库,我想知道如何从数据库访问id字段?这就是我目前所拥有的,_id返回一个空字符串

代码语言:javascript
复制
type Post {
  _id: ID!
  title: String!
  content: String!
  comments: [Comment!]
  author: User!
  created: Date!
}

type Query {
  post(_id: ID!): Post
  ...
}
代码语言:javascript
复制
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
}
EN

Stack Overflow用户

发布于 2021-08-20 16:09:40

gqlgen中的ID类型创建了一个字符串,但mongo中的_id可能是一个primitive.ObjectId,它可能会产生问题,这取决于您如何与mongo交互。

最好将bson标签设置为_id

考虑设置以下结构来覆盖gql生成的流。可以使用Hex()方法将id转换为字符串。

代码语言:javascript
复制
type Post struct{
  ID primitive.ObjectID `bson:"_id" json:"id"`
  title: string
  content: string
  comments: []Comment
  author: User
  created: time.Time
}

如果_ids中有许多结构,您可能希望自动执行此操作。为了避免覆盖,您可以实现一个钩子来自动生成bson标记

代码语言:javascript
复制
 type Post {
  id: ID!
  title: String!
  content: String!
  comments: [Comment!]
  author: User!
  created: Date!
}

现在,在文件结构中创建一个名为"hooks“的新目录,并创建一个新文件"bson.go”

复制并粘贴以下内容

代码语言:javascript
复制
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://github.com/99designs/gqlgen/issues/865

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65659122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档