I am currently creating a golang api using GoFiber V2.
I have the following document structure for a music track in a Mongo database:
{
"_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:
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). The structure of the embedded variations is an object with no key, rather a mongo ID string which is dynamic.
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.
CodePudding user response:
I suggest to avoid using interface{}
(or any
) whenever possible, use concrete types. E.g. genres
is a string array, in Go use []string
.
For the variations.variations
field you may use a map
with string
key and a struct type describing its elements.
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"`
}