-1

我有以下 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回整数。

问题:

是否有另一种方法可以按原样保存数据?例如将整数值保存为整数值?

4

1 回答 1

1

如果您查看保存的文档,您会发现它的_id属性已经是一个数字(而不是字符串),所以是的,这绝对是可能的。

您最终获得customer_id属性类型string的原因是因为您保存的文档(conditions变量)包含属性stringcustomer_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对表单输入数据进行建模的类型,并使用像Gorilla 架构这样的库以类型感知的方式解组到该结构中。

于 2017-08-15T10:07:54.140 回答