我正在使用MongoDB和golang作为驱动程序创建简单的REST。我能够创建POST请求,在这里可以找到:终端输出。
但是,在创建GET请求时,我总是需要通过bson _id获得它。是否有人能让我知道如何从json检索,而不是从golang脚本中检索bson _id。如果这是不可能的,如果有人让我知道如何将id转换为_id,我将不胜感激。
模型/用户。
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文件
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
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
}发布于 2022-01-03 22:26:35
是否有人能让我知道如何从json检索,而不是从golang脚本中检索bson _id。
只有将bson保存为对象中的附加字段中的十六进制字符串,才能做到这一点,但不要这样做。这是不必要的,你什么也得不到。
如果这是不可能的,如果有人让我知道如何将id转换为_id,我将不胜感激。
有两个函数将bson ObjectID转换为string和string转换为bson ObjectID。
对于id到_id,您已经在代码中使用了该函数:
oid := bson.ObjectIdHex(id)bson.ObjectIdHex()将objectID的十六进制表示转换为bson.objectID。十六进制表示是在JSON输出中可以看到的。
调用该函数之后,将得到bson.ObjetID。有一个方法.Hex()可以获得该对象的十六进制(text/json)表示。
oid := bson.ObjectIdHex(id)
json_represenation_of_bson_object_id = oid.Hex()另外,您使用的是旧的mongo驱动程序,您应该使用MongoDB编写和维护的新驱动程序:
https://stackoverflow.com/questions/70556036
复制相似问题