[GODRIVER-1493] Map keys always use stringer function Created: 21/Feb/20  Updated: 24/Feb/20  Resolved: 24/Feb/20

Status: Closed
Project: Go Driver
Component/s: BSON
Affects Version/s: 1.3.0
Fix Version/s: None

Type: Improvement Priority: Major - P3
Reporter: Anonymous User Assignee: Unassigned
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

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)
	}
}

 

 
 



 Comments   
Comment by Esha Bhargava [ 24/Feb/20 ]

Same as GODRIVER-1494

Generated at Thu Feb 08 08:36:30 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.