4

我有一个包含math/big.Int字段的结构。我想使用mgo将结构保存在mongodb中。在我的情况下,将数字保存为字符串就足够了。

我查看了可用字段的标签,没有任何接缝允许自定义序列化程序。我期待实现一个类似于encoding/json.Marshaler但我在文档中发现没有这样的接口的接口。

这是我想要的一个简单的例子。

package main

import (
    "labix.org/v2/mgo"
    "math/big"
)

type Point struct {
    X, Y *big.Int
}

func main() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()

    c := session.DB("test").C("test")
    err = c.Insert(&Point{big.NewInt(1), big.NewInt(1)})
    if err != nil { // should not panic
        panic(err)
    }

    //  The code run as expected but the fields X and Y are empty in mongo
}

谢谢!

4

1 回答 1

6

类似的接口被命名为bson.Getter

它看起来类似于:

func (point *Point) GetBSON() (interface{}, error) {
    return bson.D{{"x", point.X.String()}, {"y", point.Y.String()}}, nil
}

如果您有兴趣,setter 端还有对应的接口:

要使用它,请注意bson.Raw作为参数提供的类型具有Unmarshal方法,因此您可以具有类似于以下的类型:

type dbPoint struct {
    X string
    Y string
}

并方便地解组它:

var dbp dbPoint
err := raw.Unmarshal(&dbp)

然后使用dbp.Xanddbp.Y字符串将大整数放回(point *Point)未编组的真实对象中。

于 2013-09-02T22:39:45.007 回答