将 mongo 数据库集合查询到结构中

Querying a mongo DB collection into a struct

定义这个结构

type SymbolMCAddrPort struct {
        ID        bson.ObjectId `bson:"_id,omitempty"`
        Symbol    string
        MCAddr    string
        MCPort    int
}

session, err := mgo.Dial("10.0.0.61")
if err != nil {
    panic(err)
}

defer session.Close()

csap := session.DB("FX").C("MCAddrPortPairs")

如果我说

var resultsSMP bson.M
err = csap.Find(bson.M{"Symbol": "EUR/USD"}).One(&resultsSMP)
fmt.Println(resultsSMP)

我没看错

map[_id:ObjectIdHex("56fc34e961fed32064e656b0") Symbol:EUR/USD MCAddr:239.0.0.222 MCPort:345]

但是如果我说

resultsSMP := SymbolMCAddrPort{}
err = csap.Find(bson.M{"Symbol": "EUR/USD"}).One(&resultsSMP)

if err != nil {
    panic(err)
}

fmt.Println(resultsSMP)

刚看到

{ObjectIdHex("56fc34e961fed32064e656b0")   0}

我注意到 ID 是正确的,但我无法获取结构中的其余字段?

使用tags to hint Unmarshal每个字段的键名。

type SymbolMCAddrPort struct {
   ID        bson.ObjectId `bson:"_id,omitempty"`
   Symbol    string `bson:"Symbol"`
   MCAddr    string `bson:"MCAddr"`
   MCPort    int `bson:"MCPort"`
}

来自 Unmarshal

的文档

The lowercased field name is used as the key for each exported field, but this behavior may be changed using the respective field tag.

所以默认情况下,当您使用结构时,它期望键是字段名称的小写值。当键名应该是任何其他字段标签时,必须使用字段标签来指定键名。