2016-10-06 2 views
1

Ich möchte MongoDB Objekt Attributwert durch Überprüfung der Objekt-ID aktualisieren. das ist der Typ bson.Objectid. Ich benutze mgo.v2 MongoDB Golang Treiber. Aber in diesem Fall sende ich die PUT Anfrage an die Update-API. Ich sende den object id HEX-Wert als Zeichenfolge an die Golang-API. Aber es gibt einen Fehler auf meiner Golang-Seite, wenn der HEX-Wert in die bson.Object-Variable dekodiert wird.
Wie mache ich das richtig?übergeben Sie die Mongodb Bson.Objectid von JavaScript (Frontend) zu Go (Backend)


Frontend:

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); 
      } 
    }); 

Go Seite (Server-Seite):

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 
}; 

Ausgabe

log error : There is error happening decoding widget 

Wie Hex-Wert in bson.ObjectId Typ dekodieren.

+0

können Sie auch den Fehler protokollieren? 'log.Errorf (" Es gibt Fehler passiert Decodierung Widget:% v ", err);' – abhink

+0

Es ist ok..aber meine Frage ist anders –

Antwort

0

1-Decode Hex-Wert in bson.ObjectId Typ mit:

bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 

2- indem Sie Objekt-ID MongoDB Objektattributwert zu aktualisieren, können Sie verwenden

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

Hier ist der Code Arbeits ist:

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

Ausgabe:

[{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- Ihren Code hat einige Fehler:

Protokollfehler: Es Fehler passiert ist Widget Decodierung

Dieser Fehler gehört zu

err := decoder.Decode(&widget) 

ändern es zu diesem:

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

, um genauen Fehler zu sehen.


ändern

var widget models.DashboardWidget 

zu

var widget Widget 

So:

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) 
    } 
} 

und

JSON.stringify(widget) 

erzeugt:

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

Dies funktioniert:

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

Ausgang:

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

@sandunpriyanka: Ich hoffe, das hilft. –

+1

Danke @amd. –

Verwandte Themen