When you insert a map into a collection the keys are always `fmt.Sprint`ed, and therefore always use the `String()` function if one exists on that type - this is not always ideal.
Please see the below example for a valid use case and further explanation of the current versus desired behaviour:
package mainimport ( "context" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type MyConstantyType stringconst ( TheFirst MyConstantyType = "TheFirst" TheSecond MyConstantyType = "TheSecond" ) var myConstantyTypeDisplayNames = map[MyConstantyType]string{ TheFirst: "The first one", TheSecond: "The second one", } func (m MyConstantyType) String() string { return myConstantyTypeDisplayNames[m] } type OuterType struct { Things map[MyConstantyType]int } func main() { opts := options.Client().ApplyURI("mongodb://localhost") client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) } defer client.Disconnect(context.TODO()) o := &OuterType{ Things: map[MyConstantyType]int{ TheFirst: 12312, TheSecond: 9876, }, } /* We would expect the above to be stored in the database as: { "things": { "TheFirst": 12312, "TheSecond": 9876, } } But it is actually stored as: { "things": { "The first one": 12312, "The second one": 9876, } } This is because of the stringer method `String()` here, which is called from the `fmt.Sprint(key)` at https://github.com/mongodb/mongo-go-driver/blob/master/bson/bsoncodec/map_codec.go#L82 */ _, err = client.Database("test").Collection("test").InsertOne(context.TODO(), o) if err != nil { panic(err) } }