31 lines
689 B
Go
31 lines
689 B
Go
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
|
|
}
|