使用go

时间:2015-10-08 20:40:37

标签: mongodb go mongodb-query

我正在尝试使用Mongodb在Go中编写一个简单的Web应用程序。 我创建了一个简约的简单模型/控制器设置。 我可以使用带有url" / user"的POST创建新用户使用' {"伪":" bobby1"}'等数据。用户已创建。但是,当查看Mongodb shell时,我得到:

{ "_id" : ObjectId("5616d1ea56ca4dbc03bb83bc"), "id" : ObjectId("5616d1ea5213c64824000001"), "pseudo" : "bobby2"}

" id" field是来自我的struct和" _id"田野是来自Mongodb的田地。通过查看不同的示例代码,看起来我可以使用来自Mongodb的那个,但我无法找到如何做到这一点。>< 由于" id"仅供我使用,我无法通过他们的ID找到用户,因为我没有那个... 更重要的是,当我做一个GET /用户时,它返回完整的用户列表,我只得到:

{"id":"5616d1ea5213c64824000001","pseudo":"bobby2"

不是"真实" Mongodb Id ...

谢谢,

以下是代码:

模型/ user.go

const userCollection = "user"

// Get our collection
var C *mgo.Collection = database.GetCollection(userCollection)

// User represents the fields of a user in db
type User struct {
    Id     bson.ObjectId `json:"id"i bson:"_id,omitempty"`
    Pseudo string        `json:"pseudo" bson:"pseudo"`
}

// it will return every users in the db
func UserFindAll() []User {
    var users []User
    err := C.Find(bson.M{}).All(&users)
    if err != nil {
        panic(err)
    }
    return users
}

// UserFIndId return the user in the db with
// corresponding ID
func UserFindId(id string) User {
    if !bson.IsObjectIdHex(id) {
        s := fmt.Sprintf("Id given %s is not valid.", id)
        panic(errors.New(s))
    }
    oid := bson.ObjectIdHex(id)
    u := User{}
    if err := C.FindId(oid).One(&u); err != nil {
        panic(err)
    }
    return u
}

// UserCreate create a new user on the db
func UserCreate(u *User) {
    u.Id = bson.NewObjectId()
    err := C.Insert(u)
    if err != nil {
        panic(err)
    }
}

控制器/ user.go

/ GetAll returns all users
func (us *UserController) GetAll(w http.ResponseWriter, request *http.Request) {
    //  u := model.User{
    //      ID:     "987654321",
    //      Pseudo: "nikko",
    //  }
    users := model.UserFindAll()
    bu, err := json.Marshal(users)
    if err != nil {
        fmt.Printf("[-] Error while marshaling user struct : %v\n", err)
        w.Write([]byte("Error Marshaling"))
        w.WriteHeader(404)
        return
    }

    w.Header().Set("Content-type", "application/json")
    w.WriteHeader(200)
    fmt.Fprintf(w, "%s\n", bu)
}

// Get return a specific user according to Id
func (us *UserController) Get(w http.ResponseWriter, request *http.Request) {
    vars := mux.Vars(request)
    ps := vars["id"]
    u := model.UserFindId(ps)
    bu, err := json.Marshal(u)
    if err != nil {
        fmt.Printf("[-] Error while marshaling user struct : %v\n", err)
        w.Write([]byte("Error Marshaling"))
        w.WriteHeader(404)
        return
    }

    w.Header().Set("Content-type", "application/json")
    w.WriteHeader(200)
    fmt.Fprintf(w, "%s\n", bu)
}

func (us *UserController) Post(w http.ResponseWriter, r *http.Request) {
    u := model.User{}
    json.NewDecoder(r.Body).Decode(&u)
    model.UserCreate(&u)
    bu, err := json.Marshal(u)

    if err != nil {
        fmt.Printf("[-] Error PUT user struct : %v\n", err)
        w.WriteHeader(404)
        return
    }

    w.Header().Set("Content-type", "application/json")
    w.WriteHeader(201)
    fmt.Fprintf(w, "%s\n", bu)
}

1 个答案:

答案 0 :(得分:0)

看起来你的struct标签中有一个迷路字符:

type User struct {
    Id     bson.ObjectId `json:"id"i bson:"_id,omitempty"`
    Pseudo string        `json:"pseudo" bson:"pseudo"`
}

i之后,json:"id"不应该存在。它应该是:

type User struct {
    Id     bson.ObjectId `json:"id" bson:"_id,omitempty"`
    Pseudo string        `json:"pseudo" bson:"pseudo"`
}