2013-09-02 5 views
3

У меня есть структура, которая содержит math/big.Int полей. Я хотел бы сохранить структуру в mongodb, используя mgo. Сохранение чисел как строк достаточно хорошо в моей ситуации.Как вставить математику/big.Int в mongo через mgo в golang

Я просмотрел теги доступного поля и ничего швов, чтобы разрешить использование сериализатора. Я ожидал реализовать интерфейс, похожий на 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 
} 

Thnaks!

ответ

6

Подобный интерфейс называется bson.Getter:

Это может выглядеть примерно так:

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

И есть также интерфейс аналог в инкубационном стороны, если Вы заинтересованы:

Для его использования, обратите внимание, что bson.Raw типа предоставляется в качестве параметра имеет Unmarshal метод, чтобы вы могли иметь тип, похожий на:

type dbPoint struct { 
    X string 
    Y string 
} 

и распаковать его удобно:

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

, а затем использовать строки dbp.X и dbp.Y строки t o положил большие ints обратно в реальный (point *Point), будучи немаршаллированным.

Смежные вопросы