2016-10-06 32 views
1

我想通過檢查對象ID來更新MongoDB對象屬性值。這是類型是bson.Objectid。我正在使用mgo.v2 MongoDB Golang驅動程序。 但在這種情況下,我發送PUT請求到更新API。 我將object id HEX值作爲字符串發送到Golang API。 但是,在將HEX值解碼爲bson.Object類型變量時,我的Golang端發生錯誤。
我該如何正確做到這一點。將JavaScript(fronend)中的mongodb bson.Objectid傳遞給Go(後端)


前端:

HEXVALUE = "57f54ef4d6e0ac55f6c7ff24" 

var widget = {id: HEXVALUE, position: 2, type: 2, class: "normal"}; 

    $.ajax({ 
      url: 'api/widget', 
      type: 'PUT', 
      contentType: "application/json", 
      data: JSON.stringify(widget), 
      success: function (data) { 
       console.log(data); 
      }, 
      error: function (e) { 
       console.log(e); 
      } 
    }); 

轉到側(服​​務器端):

type Widget struct { 
    Id  bson.ObjectId `json:"id" bson:"_id"` 
    Position int   `json:"position" bson:"position"` 
    Type  int   `json:"type" bson:"type"` 
    Class string  `json:"class" bson:"class"` 
} 


func UpdateWidget(w http.ResponseWriter, r *http.Request) (error) { 
    decoder := json.NewDecoder(r.Body) 
    var widget models.DashboardWidget 
    err := decoder.Decode(&widget) 
    if err != nil { 
     log.Error("There is error happening decoding widget: %v", err); 
     return err; 
    } 
reurn nil 
}; 

輸出

log error : There is error happening decoding widget 

如何十六進制值解碼成bson.ObjectId類型。

+0

你能也記錄錯誤? 'log.Errorf(「有錯誤發生解碼部件:%v」,錯誤);' – abhink

+0

沒關係..但我的問題不同 –

回答

0

1-解碼十六進制值成使用bson.ObjectId類型:

bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 

2-要更新的MongoDB對象通過​​檢查對象的id屬性值,則可以使用

c.Update(bson.M{"_id": widget.Id}, widget) 

下面是工作的代碼:

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
    "net/http" 
    "strings" 

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

func main() { 
    session, err := mgo.Dial("localhost") 
    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 
    session.SetMode(mgo.Monotonic, true) // Optional. Switch the session to a monotonic behavior. 
    c := session.DB("test").C("Widget") 
    c.DropCollection() 
    err = c.Insert(
     &Widget{bson.NewObjectId(), 1, 2, "c1"}, 
     &Widget{bson.NewObjectId(), 20, 2, "normal"}, 
     &Widget{bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24"), 2, 2, "normal"}) 
    if err != nil { 
     log.Fatal(err) 
    } 

    result := []Widget{} 
    err = c.Find(bson.M{}).All(&result) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(result) 

    s := `{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}` 
    decoder := json.NewDecoder(strings.NewReader(s)) 
    var widget Widget 
    err = decoder.Decode(&widget) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(widget) 

    c.Update(bson.M{"_id": widget.Id}, widget) 

    result2 := []Widget{} 
    err = c.Find(bson.M{}).All(&result2) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(result2) 

    //http.HandleFunc("/", UpdateWidget) 
    //http.ListenAndServe(":80", nil) 

} 
func UpdateWidget(w http.ResponseWriter, r *http.Request) { 
    decoder := json.NewDecoder(r.Body) 
    var widget Widget //models.DashboardWidget 
    err := decoder.Decode(&widget) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

type Widget struct { 
    Id  bson.ObjectId `json:"id" bson:"_id"` 
    Position int   `json:"position" bson:"position"` 
    Type  int   `json:"type" bson:"type"` 
    Class string  `json:"class" bson:"class"` 
} 

輸出:

[{ObjectIdHex("57f62973c3176903402adb5e") 1 2 c1} {ObjectIdHex("57f62973c3176903402adb5f") 20 2 normal} {ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}] 
{ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal} 
[{ObjectIdHex("57f62973c3176903402adb5e") 1 2 c1} {ObjectIdHex("57f62973c3176903402adb5f") 20 2 normal} {ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}] 

3-你的代碼有一些錯別字:

日誌錯誤:有錯誤發生的解碼插件

此錯誤屬於

err := decoder.Decode(&widget) 

變化它是這樣的:

err := decoder.Decode(&widget) 
if err != nil { 
    log.Fatal(err) 
} 

看到確切的錯誤。


變化

var widget models.DashboardWidget 

var widget Widget 

像這樣:

func UpdateWidget(w http.ResponseWriter, r *http.Request) { 
    decoder := json.NewDecoder(r.Body) 
    var widget Widget //models.DashboardWidget 
    err := decoder.Decode(&widget) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

JSON.stringify(widget) 

產生:

`{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}` 

這工作得很好:

package main 

import (
    "encoding/json" 
    "fmt" 
    "strings" 

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

func main() { 
    s := `{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}` 
    decoder := json.NewDecoder(strings.NewReader(s)) 
    var widget Widget 
    err := decoder.Decode(&widget) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(widget) 
} 

type Widget struct { 
    Id  bson.ObjectId `json:"id" bson:"_id"` 
    Position int   `json:"position" bson:"position"` 
    Type  int   `json:"type" bson:"type"` 
    Class string  `json:"class" bson:"class"` 
} 

輸出:

{ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal} 
+0

@sandunpriyanka:我希望這有助於。 –

+1

謝謝@amd。 –