[英]Golang Struct for Nested Objects
I am currently creating a golang api using GoFiber V2.我目前正在使用 GoFiber V2 创建一个 golang api。
I have the following document structure for a music track in a Mongo database:我在 Mongo 数据库中有以下音乐曲目的文档结构:
{
"_id" : ObjectId("63cc26cb86ae1611380e1206"),
"active" : 1,
"exclusive" : "false",
"track_title" : "Burn Slow (sting)",
"artist_id" : "395",
"artist_name" : "David Hollandsworth",
"album_title" : "Cult Justice 23",
"composer" : "David Hollandsworth",
"duration" : "00:16",
"publisher" : "FlikTrax, LLC",
"description" : "T.V. drama, rural tension, apprehension. Style: \"Hell on Wheels\" soundtrack.",
"url_path" : "davidhollandsworth/cultjustice23/burn-slow-sting.wav",
"vocal_type" : "instrumental",
"beats_per_minute" : "80",
"file_path_compressed" : "davidhollandsworth/cultjustice23/burn-slow-sting.mp3",
"file_path_uncompressed" : "davidhollandsworth/cultjustice23/burn-slow-sting.wav",
"genres" : [
"Tension",
"Americana",
"Tv Drama"
],
"genres_keys" : [
"tension",
"americana",
"tv drama"
],
"moods" : [
"tension",
"bluesy",
"spacey"
],
"styles" : [
"tv drama",
"unsolved mystery",
"western"
],
"instruments" : [
"dobro",
"banjo",
"percussion"
],
"keywords" : [
"rural-tension",
" showdown",
" apprehension",
" uncertainty",
" light-tension",
" strings-tension",
" heartland",
" trouble",
" uneasy",
" cautious",
" outlaw",
" yellowstone",
" bayou",
" gritty",
" swampy",
" swamp-people",
" southern",
" uncertain",
" drama",
" apprehension",
" bluesy",
" blues",
" shack",
" poor-folk",
" primitive"
],
"sounds_like" : [
"Brian Tyler",
"Max Richter",
"T.V. Drama"
],
"resembles_song" : [
"Hell on Wheels",
"Yellowstone",
"Rural/Outlaw/Tension"
],
"last_modified" : 1674323659,
"variation_count" : 5,
"variations" : {
"_id" : ObjectId("63cc26bc86ae1611380e1200"),
"track_title" : "Burn Slow",
"artist_name" : "David Hollandsworth",
"master_track_id" : "63cc26bc86ae1611380e1200",
"master_track" : ObjectId("63cc26bc86ae1611380e1200"),
"merged" : 1,
"variation_count" : 5,
"variations" : {
"63cc26bc86ae1611380e1200" : {
"track_id" : "63cc26bc86ae1611380e1200",
"track_title" : "Burn Slow",
"artist_name" : "David Hollandsworth"
},
"63cc26c086ae1611380e1203" : {
"track_id" : "63cc26c086ae1611380e1203",
"track_title" : "Burn Slow (bed mix)",
"artist_name" : "David Hollandsworth"
},
"63cc26c386ae1611380e1204" : {
"track_id" : "63cc26c386ae1611380e1204",
"track_title" : "Burn Slow (cutdown)",
"artist_name" : "David Hollandsworth"
},
"63cc26c786ae1611380e1205" : {
"track_id" : "63cc26c786ae1611380e1205",
"track_title" : "Burn Slow (lows and perc)",
"artist_name" : "David Hollandsworth"
},
"63cc26cb86ae1611380e1206" : {
"track_id" : "63cc26cb86ae1611380e1206",
"track_title" : "Burn Slow (sting)",
"artist_name" : "David Hollandsworth"
}
}
}
}
Currently I have the following struct for the track in my Golang model:目前我的 Golang model 中有以下轨道结构:
type Track struct {
ID primitive.ObjectID `bson:"_id, omitempty" json:"_id"`
TrackTitle string `bson:"track_title" json:"track_title"`
ArtistId string `bson:"artist_id" json:"artist_id"`
ArtistName string `bson:"artist_name" json:"artist_name"`
AlbumTitle string `bson:"album_title" json:"album_title"`
Composer string `bson:"composer" json:"composer"`
Publisher string `bson:"publisher" json:"publisher"`
Description string `bson:"description" json:"description"`
Duration string `bson:"duration" json:"duration"`
UrlPath string `bson:"url_path" json:"url_path"`
VocalType string `bson:"vocal_type" json:"vocal_type"`
BeatsPerMinute string `bson:"beats_per_minute" json:"beats_per_minute"`
FilePathCompressed string `bson:"file_path_compressed" json:"bfile_path_compressed"`
FilePathUncompressed string `bson:"file_path_uncompressed" json:"file_path_uncompressed"`
PreviewURL string `bson:"preview_url" json:"preview_url"`
Genres []interface{} `bson:"genres" json:"genres"`
GenresKeys []interface{} `bson:"genres_keys" json:"genres_keys"`
Moods []interface{} `bson:"moods" json:"moods"`
Styles []interface{} `bson:"styles" json:"styles"`
Instruments []interface{} `bson:"instruments" json:"instruments"`
Keywords []interface{} `bson:"keywords" json:"keywords"`
SoundsLike []interface{} `bson:"sounds_like" json:"sounds_like"`
ResemblesSong []interface{} `bson:"resembles_song" json:"resembles_song"`
LastModified int `bson:"last_modified" json:"last_modified"`
VariationCount int `bson:"variation_count" json:"variation_count"`
}
Currently all document fields are being decoded properly as JSON, however I'm at an impasse right now on how to struct the embedded "variations.variations" field (note that there variations within variations).目前所有文档字段都被正确解码为 JSON,但是我现在在如何构建嵌入式“variations.variations”字段方面陷入僵局(请注意,变化中存在变化)。 The structure of the embedded variations is an object with no key, rather a mongo ID string which is dynamic.
嵌入式变体的结构是一个没有密钥的 object,而是一个动态的 mongo ID 字符串。
I have tried implementing a custom structs and interface types but to no avail.我尝试过实现自定义结构和接口类型,但无济于事。
If anyone has run into this issue before, any help would be appreciated.如果有人以前遇到过这个问题,我们将不胜感激。
I suggest to avoid using interface{}
(or any
) whenever possible, use concrete types.我建议尽可能避免使用
interface{}
(或any
),使用具体类型。 Eg genres
is a string array, in Go use []string
.例如
genres
是一个字符串数组,在 Go 中使用[]string
。
For the variations.variations
field you may use a map
with string
key and a struct type describing its elements.对于
variations.variations
字段,您可以使用带有string
键和描述其元素的结构类型的map
。
type Track struct {
ID primitive.ObjectID `bson:"_id, omitempty" json:"_id"`
TrackTitle string `bson:"track_title" json:"track_title"`
ArtistId string `bson:"artist_id" json:"artist_id"`
ArtistName string `bson:"artist_name" json:"artist_name"`
AlbumTitle string `bson:"album_title" json:"album_title"`
Composer string `bson:"composer" json:"composer"`
Publisher string `bson:"publisher" json:"publisher"`
Description string `bson:"description" json:"description"`
Duration string `bson:"duration" json:"duration"`
UrlPath string `bson:"url_path" json:"url_path"`
VocalType string `bson:"vocal_type" json:"vocal_type"`
BeatsPerMinute string `bson:"beats_per_minute" json:"beats_per_minute"`
FilePathCompressed string `bson:"file_path_compressed" json:"bfile_path_compressed"`
FilePathUncompressed string `bson:"file_path_uncompressed" json:"file_path_uncompressed"`
PreviewURL string `bson:"preview_url" json:"preview_url"`
Genres []string `bson:"genres" json:"genres"`
GenresKeys []string `bson:"genres_keys" json:"genres_keys"`
Moods []string `bson:"moods" json:"moods"`
Styles []string `bson:"styles" json:"styles"`
Instruments []string `bson:"instruments" json:"instruments"`
Keywords []string `bson:"keywords" json:"keywords"`
SoundsLike []string `bson:"sounds_like" json:"sounds_like"`
ResemblesSong []string `bson:"resembles_song" json:"resembles_song"`
LastModified int `bson:"last_modified" json:"last_modified"`
VariationCount int `bson:"variation_count" json:"variation_count"`
Variations Variations `bson:"variations" json:"variations"`
}
type Variations struct {
ID primitive.ObjectID `bson:"_id" json:"_id"`
TrackTitle string `bson:"track_title" json:"track_title"`
ArtistName string `bson:"artist_name" json:"artist_name"`
MasterTrackID string `bson:"master_track_id" json:"master_track_id"`
MasterTrack primitive.ObjectID `bson:"master_track" json:"master_track"`
Merged int `bson:"merged" json:"merged"`
VariationCount int `bson:"variation_count" json:"variation_count"`
Variations map[string]Variation `bson:"variations" json:"variations"`
}
type Variation struct {
TrackID string `bson:"track_id" json:"track_id"`
TrackTitle string `bson:"track_title" json:"track_title"`
ArtistName string `bson:"artist_name" json:"artist_name"`
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.