我有一个引用 *big. Int的结构体。当将这个结构体简单地存储到MongoDB中时(使用官方驱动程序),当取回结构体时,字段变为nil。将big.Int存储到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
字符集
到目前为止,我最好的想法是围绕big.int创建一个实现MarshalBSON
和UnmarshalBSON
的 Package 器(老实说,我甚至不确定如何正确地做)。
2条答案
按热度按时间yr9zkbsy1#
下面是我提出的一个可能的实现,它将big.Int以纯文本形式存储到MongoDb中。也可以通过使用big.Int的方法
Bytes
和SetBytes
而不是MarshalText
/UnmarshalText
轻松存储为字节数组。字符集
woobm2wo2#
当取回结构体时,该字段变为nil
它返回0的原因是因为big.int没有
bson
Map。如果你检查插入MongoDB集合的文档,你应该会看到类似于下面的内容:字符集
其中
number
字段中没有存储值。如何将一个大的.Int存储到MongoDB中?
让我们先了解一下什么是
BigInt
。大整数数据类型用于整数值可能超出int数据类型支持的范围时。范围为-2^63(-9,223,372,036,854,775,808)到2^63-1(9,223,372,036,854,775,807),存储大小为8字节。通常在SQL中使用。在Go中,你可以使用更精确的整数类型。可用的built-in types int 8,int 16,int 32和int 64(和它们的无符号对应)最适合数据。Go中大整数的对应是int 64。范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807,和8字节的存储大小。
使用mongo-go-driver,您可以使用
int64
,它将被转换为bson RawValue.Int64。例如:型