dongya2030 2019-08-04 21:22
浏览 286

如何将Golang big.Int存储到MongoDB中

I have a struct referencing a *big.Int. When storing this struct naively into MongoDB (using the official driver) the field turns to be nil when fetching the struct back. What is the proper/best way to store a big.Int into MongoDB?

    type MyStruct struct {
        Number *big.Int
    }

    nb := MyStruct{Number: big.NewInt(42)}
    r, _ := db.Collection("test").InsertOne(context.TODO(), nb)

    result := &MyStruct{}
    db.Collection("test").FindOne(context.TODO(), bson.D{{"_id", r.InsertedID}}).Decode(result)
    fmt.Println(result) // <== Number will be 0 here

My best idea so far would be to create a wrapper around big.Int that implements MarshalBSON and UnmarshalBSON (which I am not even sure how to do properly to be honest). But that'd be quite inconvenient.

  • 写回答

2条回答 默认 最新

  • dongxiaoke2018 2019-08-04 22:57
    关注

    Here's a possible implementation I came up with that stores the big.Int as plain text into MongoDb. It is also possible to easily store as byte array by using methods Bytes and SetBytes of big.Int instead of MarshalText/UnmarshalText.

    package common
    
    import (
        "fmt"
        "math/big"
    
        "go.mongodb.org/mongo-driver/bson"
    )
    
    type BigInt struct {
        i *big.Int
    }
    
    func NewBigInt(bigint *big.Int) *BigInt {
        return &BigInt{i: bigint}
    }
    
    func (bi *BigInt) Int() *big.Int {
        return bi.i
    }
    func (bi *BigInt) MarshalBSON() ([]byte, error) {
        txt, err := bi.i.MarshalText()
        if err != nil {
            return nil, err
        }
        a, err := bson.Marshal(map[string]string{"i": string(txt)})
        return a, err
    }
    
    func (bi *BigInt) UnmarshalBSON(data []byte) error {
        var d bson.D
        err := bson.Unmarshal(data, &d)
        if err != nil {
            return err
        }
        if v, ok := d.Map()["i"]; ok {
            bi.i = big.NewInt(0)
            return bi.i.UnmarshalText([]byte(v.(string)))
        }
        return fmt.Errorf("key 'i' missing")
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?