私は次の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
データベースに保存する前に、文字列表現を整数に再変換することが可能です。
質問:
データをそのまま保存する別の方法はありますか?たとえば、整数値を整数値として保存しますか?
保存したドキュメントを見ると、その_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]
コメントを追加