gpt4 book ai didi

mongodb - 编码(marshal)和编码(marshal) BSON

转载 作者:行者123 更新时间:2023-12-01 22:25:11 27 4
gpt4 key购买 nike

TL;DR:MongoDB 驱动程序是否提供了编码和解码文档单个字段的功能?

这是一个非常简单的问题,但这里有一些上下文:

我有一个工作人员负责在 2 个独立的数据库之间同步数据。当它接收到事件消息时,表明某些文档必须同步,它会在主数据库中选择文档,并将其复制到另一个数据库中(这是一个完全不同的数据库,而不是副本集)。

问题是:我不知道该文档的完整结构,因此为了保留数据,我必须在 map 中解码该文档 map[string]interface{} , 或 bson.M以同样的方式工作。但这似乎有很多开销,要解码我什至不使用的所有这些数据,只是将其编码回另一个数据库。

所以我考虑创建一个只存储该文档的二进制值的结构,而不执行任何编码或解码以减少开销,如下所示:

type Document = map[string]Field

type Field struct {
Type bsontype.Type
Value []byte
}

func (f Field) MarshalBSONValue() (bsontype.Type, []byte, error) {
return f.Type, f.Value, nil
}

func (f *Field) UnmarshalBSONValue(btype bsontype.Type, value []byte) error {
f.Type = btype
f.Value = value
return nil
}

使用这种结构,我确实可以减少要解析的数据量,但是现在,我需要手动解码本文档中我需要使用的一个值。

所以我想知道MongoDB驱动程序是否有一些功能,例如:
// Hypothetical function to get the value of a BSON
var status string
if err := decodeBSON(doc['status'].Type, doc['status'].Value, &status); err != nil {
return err
}


// Hypothetical function to set the value of a BSON
createdAt, err := encodeBSON(bsontype.Date, time.Now())
if err != nil {
return err
}

doc["createdAt"] = Field{Type: bsontype.Date, Value: createdAt}

我怎样才能做到这一点?

最佳答案

代码中的 Field 类型等效于驱动程序的 bson.RawValue 类型。通过切换到 RawValue ,您可以使用 RawValue.Unmarshal 方法对各个字段进行解码,并使用 bson.MarshalValue 对字段进行编码,这将返回构建新 RawValue 所需的两个组件(类型和数据)。

如何使用这些方法根据其原始值更改字段的示例:代码中的 Field 类型等效于驱动程序的 bson.RawValue 类型。通过切换到 RawValue ,您可以使用 RawValue.Unmarshal 方法对各个字段进行解码,并使用 bson.MarshalValue 对字段进行编码,这将返回构建新 RawValue 所需的两个组件(类型和数据)。

一个示例,说明如何根据其原始值更改字段,而无需解码原始文档的所有字段:https://gist.github.com/divjotarora/06c5188138456070cee26024f223b3ee

关于mongodb - 编码(marshal)和编码(marshal) BSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60329213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com