データベースのgolangに投稿データ(整数値と文字列値を含む)を保存する正しい方法は何ですか?

スワティ語:

私は次のgolangコードを持っています:

package main

import (
    "github.com/gin-gonic/gin"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "log"
    "time"
)

func main() {
    router := gin.Default()
    router.POST("/save-address", SaveAddress)
    router.Run()
}

func SaveAddress(c *gin.Context){
    var err error
    conditions := bson.M{}
    c.Request.ParseForm()
    for key, _ := range c.Request.PostForm {
        if key != "id"{
            conditions[key] = c.PostForm(key)
        }
    }
    conditions["_id"] = 1
    mongoSession := ConnectDb()

    sessionCopy := mongoSession.Copy()
    defer sessionCopy.Close()

    getCollection := mongoSession.DB("bformssettings").C("address")
    err = getCollection.Insert(conditions)
    if err != nil{
        println(err)
    }else{
        println("Data saved successfully!!!")
    }
}
func ConnectDb() (mongoSession *mgo.Session) {
    mongoDBDialInfo := &mgo.DialInfo{
        Addrs:    []string{"localhost:27017"},
        Timeout:  60 * time.Second,
        Database: "bformssettings",
    }

    mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo)
    if err != nil {
        log.Fatalf("CreateSession: %s\n", err)
    }

    mongoSession.SetMode(mgo.Monotonic, true)

    return mongoSession
}

コードを実行すると、次の形式のデータがデータベースに保存されます。

{ "_id" : 1, "customer_id" : "3", "address" : "Chicago, IL", "city" : "Chicago", "state" : "IL", "zipcode" : "60647" }

問題:

customer_id整数値です、データベースに文字列として保存されます。

可能な回避策:

idデータベースに保存する前に、文字列表現を整数に再変換することが可能です。

質問:

データをそのまま保存する別の方法はありますか?たとえば、整数値を整数値として保存しますか?

icza:

保存したドキュメントを見ると、その_idプロパティは既に数値であり(文字列ではない)ことがわかります。そのため、これは間違いなく可能です。

あなたがで終わる理由customer_id型であるプロパティは、stringあなたが保存した文書(ためであるconditions変数)が成立するstringための値customer_idプロパティを。また、フォームの値をとして返すstring戻り値を入力したため、タイプになりますContext.PostForm()string

データベースで整数にしたい場合は、で設定する前にGo整数に変換してconditionsください。そのために、たとえば使用することができますstrconv.Atoi()

for key, _ := range c.Request.PostForm {
    value := c.PostForm(key)
    if key == "customer_id" {
        if id, err := strconv.Atoi(value); err != nil {
            // Not a valid number, handle error
        } else {
            conditions[key] = id
        }
    } else {
        if key != "id"{
            conditions[key] = value
        }
    }
}

整数値を保持するフィールドをどうにかして定義する必要あります。単一のフィールドでそれを行う方法を示したところです。それらが複数ある場合は、それらをスライスにリストし、単一のforループを使用してすべてを検出/処理できます。またはさらに良いことに、それらをセットとして機能するマップに配置すると、forループなしでこれらのフィールドを検出できます。

別のオプションはstruct、フォーム入力データをモデル化するタイプを作成し、ゴリラのスキーマのようなライブラリーを使用して、タイプに対応した方法でその構造体に非整列化することです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ