首页
学习
活动
专区
圈层
工具
发布

id对_id
EN

Stack Overflow用户
提问于 2022-01-02 12:38:56
回答 1查看 223关注 0票数 0

我正在使用MongoDB和golang作为驱动程序创建简单的REST。我能够创建POST请求,在这里可以找到:终端输出

但是,在创建GET请求时,我总是需要通过bson _id获得它。是否有人能让我知道如何从json检索,而不是从golang脚本中检索bson _id。如果这是不可能的,如果有人让我知道如何将id转换为_id,我将不胜感激。

模型/用户。

代码语言:javascript
复制
package models

import (
    "gopkg.in/mgo.v2/bson"
)

type User struct {
    Id     bson.ObjectId `json:"id" bson: "_id"`
    Name   string        `json:"name" bson: "name"`
    Gender string        `json:"gender" bson: "gender"`
    Age    int           `json:"age" bson: "age"`
}

控制器/user.go文件

代码语言:javascript
复制
type UserController struct {
    session *mgo.Session}

func httpResponse(w http.ResponseWriter, jsonOut []byte, code int) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(code)
    fmt.Fprintf(w, "%s", jsonOut)
}

func NewUserCOntroller(s *mgo.Session) *UserController {
    // return the address of UserController
    return &UserController{s}
}

func (uc UserController) GetUser(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
    id := p.ByName("id")

    if !bson.IsObjectIdHex(id) {
        w.WriteHeader(http.StatusNotFound)
    }
    // oid is something you use in mongo
    oid := bson.ObjectIdHex(id)
    u := models.User{}
    if err := uc.session.DB("mongolang").C("users").FindId(oid).One(&u); err != nil {
        w.WriteHeader(404)
        return
    }

    uj, err := json.Marshal(u)

    if err != nil {
        fmt.Println(err)
    }

    httpResponse(w, uj, http.StatusOK)

}

func (uc UserController) CreateUser(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    // its empty for now
    u := models.User{}

    json.NewDecoder(r.Body).Decode(&u)

    u.Id = bson.NewObjectId()
    uc.session.DB("mongolang").C("users").Insert(u)

    jsonOut, _ := json.Marshal(u)
    httpResponse(w, jsonOut, http.StatusOK)
    fmt.Println("Response:", string(jsonOut), " 201 OK")
}

main.go

代码语言:javascript
复制
package main

import (
    "net/http"

    "github.com/julienschmidt/httprouter"
    "gopkg.in/mgo.v2"

    "mongo-golang/controllers"
)

func main() {
    // create new instance
    r := httprouter.New()
    // new session
    uc := controllers.NewUserCOntroller(getSession())
    r.GET("/user/:id", uc.GetUser)
    r.POST("/user", uc.CreateUser)
    r.DELETE("/user/:id", uc.DeleteUser)
    http.ListenAndServe("localhost:9000", r)
}

func getSession() *mgo.Session {
    // get session and connect with mongo
    s, err := mgo.Dial("mongodb://localhost")

    if err != nil {
        panic(err)
    }
    return s
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-03 22:26:35

是否有人能让我知道如何从json检索,而不是从golang脚本中检索bson _id。

只有将bson保存为对象中的附加字段中的十六进制字符串,才能做到这一点,但不要这样做。这是不必要的,你什么也得不到。

如果这是不可能的,如果有人让我知道如何将id转换为_id,我将不胜感激。

有两个函数将bson ObjectID转换为string和string转换为bson ObjectID。

对于id到_id,您已经在代码中使用了该函数:

代码语言:javascript
复制
oid := bson.ObjectIdHex(id)

bson.ObjectIdHex()将objectID的十六进制表示转换为bson.objectID。十六进制表示是在JSON输出中可以看到的。

调用该函数之后,将得到bson.ObjetID。有一个方法.Hex()可以获得该对象的十六进制(text/json)表示。

代码语言:javascript
复制
oid := bson.ObjectIdHex(id)
json_represenation_of_bson_object_id = oid.Hex()

另外,您使用的是旧的mongo驱动程序,您应该使用MongoDB编写和维护的新驱动程序:

https://github.com/mongodb/mongo-go-driver

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

https://stackoverflow.com/questions/70556036

复制
相关文章

相似问题

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