2015-10-08 2 views
0

Я пытаюсь закодировать простое веб-приложение в Go, используя Mongodb. Я создал минималистичную простую установку модели/контроллера. Я могу создать нового пользователя с помощью POST с url "/ user" с такими данными, как '{"pseudo": "bobby1"}'. Пользователь создан. Однако, если смотреть внутрь MongoDB оболочки, я получаю:Duplicate Id in mongodb with go

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

поле «Идентификатор» является один исходя из моей структуры и поле «_ID» является один из MongoDB. От взгляда на другой пример кода, похоже, я мог использовать сам тот, который был у Mongodb, но я не могу найти, как это сделать.> < Поскольку «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) 
} 

ответ

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"` 
} 
+0

Мое добро. Я буду продолжать ударить головой и переделать эту вещь тысячу раз за прошение .... Спасибо;) – Nikkolasg