BSON 映射到数据库模型结构
BSON map to database models struct
正在努力寻找正确的方法。现在我可以将 bson 映射单独转换为我的数据库模型结构。但现在我只是在重复很多相同的代码。那么有没有更好的方法来做到这一点?
代码示例:
type Agent struct {
FirstName string `bson:"firstName,omitempty" json:"firstName,omitempty"`
LastName string `bson:"lastName,omitempty" json:"lastName,omitempty"`
ProfileImage string `bson:"profileImage,omitempty" json:"profileImage,omitempty"`
}
func BSONToAgent(bsonMap primitive.M) (agent Agent, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return agent, err
}
bson.Unmarshal(bsonBytes, &agent)
return agent, nil
}
func BSONArrayToAgents(bsonMap []primitive.M) (agents []Agent, err error) {
for _, item := range bsonMap {
agent, err := BSONToAgent(item)
if err != nil {
return agents, err
}
agents = append(agents, agent)
}
return agents, nil
}
type Form struct {
UserID primitive.ObjectID `bson:"userId,omitempty" json:"userId,omitempty"`
Name string `bson:"name,omitempty" json:"name,omitempty"`
CreatedAt time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt,omitempty"`
}
func BSONArrayToForms(bsonMap []primitive.M) (forms []Form, err error) {
for _, item := range bsonMap {
form, err := BSONToForm(item)
if err != nil {
return forms, err
}
forms = append(forms, form)
}
return forms, nil
}
func BSONToForm(bsonMap primitive.M) (form Form, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return form, err
}
bson.Unmarshal(bsonBytes, &form)
return form, nil
}
如果您查看函数 BSONToAgent 和 BSONToForm,它们几乎是相同的函数,只是类型不同 returns。 BSONArrayToAgents 和 BSONArrayToForms 也是如此。现在我想在我所有的数据库模型上实现这些功能,以便轻松转换查询数据库时返回的 primitive.M (bson 映射)。
有更好的方法吗?也许使用接口?
如果您使用 marshal/unmarshal 作为翻译 bson 的手段,您可以这样做:
func BSONToForm(bsonMap primitive.M, out interface{}) (err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return form, err
}
return bson.Unmarshal(bsonBytes, out)
}
var v Form
BSONToForm(bsonMap,&v)
虽然这对数组不太适用,因此您可以这样做:
func BSONArrayToForms(bsonMap []primitive.M, newItem func() interface{}, add func(interface{})) (err error) {
for _, item := range bsonMap {
n:=newItem()
err := BSONToForm(item,n)
if err != nil {
return forms, err
}
add(n)
}
return nil
}
forms:=make([]Form,0)
BSONArrayToForms(bsonArr,func() interface{} {return &Form{}},func(in interface{}) {
forms=append(forms,*(in.(*Form)))
})
或单功能变体:
func BSONArrayToForms(bsonMap []primitive.M, newItem func() interface{}) (err error) {
for _, item := range bsonMap {
n:=newItem()
err := BSONToForm(item,n)
if err != nil {
return forms, err
}
}
return nil
}
forms:=make([]Form,0)
BSONArrayToForms(bsonArr,func() interface{} {
forms=append(forms,Form{})
return &forms[len(forms)-1]})
此版本必须确保返回的指针也存储在数组中。
正在努力寻找正确的方法。现在我可以将 bson 映射单独转换为我的数据库模型结构。但现在我只是在重复很多相同的代码。那么有没有更好的方法来做到这一点?
代码示例:
type Agent struct {
FirstName string `bson:"firstName,omitempty" json:"firstName,omitempty"`
LastName string `bson:"lastName,omitempty" json:"lastName,omitempty"`
ProfileImage string `bson:"profileImage,omitempty" json:"profileImage,omitempty"`
}
func BSONToAgent(bsonMap primitive.M) (agent Agent, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return agent, err
}
bson.Unmarshal(bsonBytes, &agent)
return agent, nil
}
func BSONArrayToAgents(bsonMap []primitive.M) (agents []Agent, err error) {
for _, item := range bsonMap {
agent, err := BSONToAgent(item)
if err != nil {
return agents, err
}
agents = append(agents, agent)
}
return agents, nil
}
type Form struct {
UserID primitive.ObjectID `bson:"userId,omitempty" json:"userId,omitempty"`
Name string `bson:"name,omitempty" json:"name,omitempty"`
CreatedAt time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt,omitempty"`
}
func BSONArrayToForms(bsonMap []primitive.M) (forms []Form, err error) {
for _, item := range bsonMap {
form, err := BSONToForm(item)
if err != nil {
return forms, err
}
forms = append(forms, form)
}
return forms, nil
}
func BSONToForm(bsonMap primitive.M) (form Form, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return form, err
}
bson.Unmarshal(bsonBytes, &form)
return form, nil
}
如果您查看函数 BSONToAgent 和 BSONToForm,它们几乎是相同的函数,只是类型不同 returns。 BSONArrayToAgents 和 BSONArrayToForms 也是如此。现在我想在我所有的数据库模型上实现这些功能,以便轻松转换查询数据库时返回的 primitive.M (bson 映射)。
有更好的方法吗?也许使用接口?
如果您使用 marshal/unmarshal 作为翻译 bson 的手段,您可以这样做:
func BSONToForm(bsonMap primitive.M, out interface{}) (err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return form, err
}
return bson.Unmarshal(bsonBytes, out)
}
var v Form
BSONToForm(bsonMap,&v)
虽然这对数组不太适用,因此您可以这样做:
func BSONArrayToForms(bsonMap []primitive.M, newItem func() interface{}, add func(interface{})) (err error) {
for _, item := range bsonMap {
n:=newItem()
err := BSONToForm(item,n)
if err != nil {
return forms, err
}
add(n)
}
return nil
}
forms:=make([]Form,0)
BSONArrayToForms(bsonArr,func() interface{} {return &Form{}},func(in interface{}) {
forms=append(forms,*(in.(*Form)))
})
或单功能变体:
func BSONArrayToForms(bsonMap []primitive.M, newItem func() interface{}) (err error) {
for _, item := range bsonMap {
n:=newItem()
err := BSONToForm(item,n)
if err != nil {
return forms, err
}
}
return nil
}
forms:=make([]Form,0)
BSONArrayToForms(bsonArr,func() interface{} {
forms=append(forms,Form{})
return &forms[len(forms)-1]})
此版本必须确保返回的指针也存储在数组中。