gpt4 book ai didi

mongodb - bson 方案的 Virtuals 属性

转载 作者:IT王子 更新时间:2023-10-29 02:10:43 25 4
gpt4 key购买 nike

我总是使用 virtuals properties在我的节点项目中使用 mongoose 的文档,并希望在我的 golang 项目中使用相同的机制。我找不到实现此类功能的最佳方法。

我有一些结构,从我的数据库中检索并希望根据我的服务器配置(如 IP 地址等)添加字段。我想避免每次获取此集合的文档时都调用相同的函数。

最佳答案

最简单的方法是简单地向结构添加一个方法来计算您想要的值,并在需要时调用该方法。

例如:

type Person struct {
FirstName string `bson:"firstName"`
LastName string `bson:"lastName"`
}

func (p *Person) Name() string {
return p.FirstName + " " + p.LastName
}

func main() {
p := &Person{FirstName: "Bob", LastName: "Archer"}
fmt.Println(p.Name())
}

这样做的好处是,即使您在检索文档后修改了名字或姓氏,Name() 也会始终返回“正确”的名字。

如果你想避免总是计算结果,你可以将它存储在一个字段中,例如:

type Person struct {
FirstName string `bson:"firstName"`
LastName string `bson:"lastName"`
name string
}

func (p *Person) Name() string {
if p.name == "" {
p.name = p.FirstName + " " + p.LastName
}
return p.name
}

请注意,当保存 Person 的值时,name 字段不会被保留,因为它没有被导出。

如果您想自动执行此操作(例如,您希望在从 MongoDB 获取文档时自动计算 name),您可以通过实现 bson.Setter 来编写自定义解码逻辑。界面。自定义解码逻辑没什么特别的,只是在执行默认编码逻辑后计算和设置 name 字段。

例如:

type Person struct {
FirstName string `bson:"firstName"`
LastName string `bson:"lastName"`
name string
}

func (p *Person) SetBSON(raw bson.Raw) (err error) {
type my Person
if err = raw.Unmarshal((*my)(p)); err != nil {
return
}
p.name = p.FirstName + " " + p.LastName
return nil
}

如果您希望导出 name 字段,例如Name,那么你可以使用- bson 标签值来排除该字段保存到MongoDB,例如:

type Person struct {
FirstName string `bson:"firstName"`
LastName string `bson:"lastName"`
Name string `bson:"-"`
}

关于mongodb - bson 方案的 Virtuals 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860637/

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