package mongoext import ( "go.mongodb.org/mongo-driver/bson" "reflect" "strings" ) // ProjectionFromStruct automatically generated a mongodb projection for a struct // This way you can pretty much always write // `options.FindOne().SetProjection(mongoutils.ProjectionFromStruct(...your_model...))` // to only get the data from mongodb that you will actually use in the later decode step func ProjectionFromStruct(obj interface{}) bson.M { v := reflect.ValueOf(obj) t := v.Type() result := bson.M{} for i := 0; i < v.NumField(); i++ { tag := t.Field(i).Tag.Get("bson") if tag == "" { continue } tag = strings.Split(tag, ",")[0] result[tag] = 1 } return result }