2016-10-06 4 views
1

オブジェクトIDを確認してMongoDBオブジェクトの属性値を更新します。つまり、型はbson.Objectidです。私はmgo.v2 MongoDB Golangドライバを使用しています。 その場合は、PUTリクエストを更新APIに送信します。 文字列としてobject idのHEX値をGolang APIに送信します。 しかし、HEX値をbson.Object型変数にデコードすると、Golang側でエラーが発生します。
これを正しく行うにはどうすればよいですか?JavaScript(fronend)からGo(バックエンド)にmongodb bson.Objectidを渡します。


フロントエンド:

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 "、err);' – abhink

+0

これは問題ありません。しかし、私の質問は異なります –

答えて

0
使用 bson.ObjectId型に

1デコード進値:

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。 –

関連する問題