#javascript #mongodb #go #bson #database
#javascript #mongodb #Вперед #bson #База данных
Вопрос:
Я хочу обновить значение атрибута объекта MongoDB, проверив идентификатор объекта. то есть тип — bson .Objectid. Я использую mgo.v2
драйвер MongoDB Golang. Но в этом случае я отправляю PUT
запрос в API обновления. Я отправляю object id
шестнадцатеричное значение в виде строки в API Golang. Но на моей стороне Golang возникает ошибка при декодировании шестнадцатеричного значения в bson.Object
переменную типа.
Как мне сделать это правильно.
Интерфейс :
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(amp;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
тип.
Комментарии:
1. Можете ли вы также зарегистрировать ошибку?
log.Errorf("There is error happening decoding widget: %v", err);
2. Все в порядке .. но мой вопрос в другом
Ответ №1:
1-Декодировать шестнадцатеричное значение в bson.ObjectId
тип, используя:
bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24")
2- Чтобы обновить значение атрибута объекта MongoDB путем проверки идентификатора объекта, вы можете использовать
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(
amp;Widget{bson.NewObjectId(), 1, 2, "c1"},
amp;Widget{bson.NewObjectId(), 20, 2, "normal"},
amp;Widget{bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24"), 2, 2, "normal"})
if err != nil {
log.Fatal(err)
}
result := []Widget{}
err = c.Find(bson.M{}).All(amp;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(amp;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(amp;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(amp;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(amp;widget)
Измените его на это:
err := decoder.Decode(amp;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(amp;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(amp;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}
Комментарии:
1. @sandunpriyanka : Надеюсь, это поможет.