package db import ( "reflect" "strings" ) type Schema struct { mgo *MgoColl reflectValue *reflect.Value reflectType reflect.Type pri interface{} schema interface{} } func NewSchema(key string, schema interface{}) *Schema { s := reflect.ValueOf(schema) if s.Kind() == reflect.Ptr { s = reflect.ValueOf(schema).Elem() } sch := &Schema{ reflectValue: &s, reflectType: s.Type(), schema: schema, } sch.mgo = NewMongoColl(sch) sch.pri = GetBsonD(sch.getPriTag(), key) return sch } func (s *Schema) GetSchemaType() reflect.Type { return s.reflectType } func (s *Schema) GetCollName() string { return strings.ToLower(s.GetSchemaType().Name()) } func (s *Schema) getPriTag() string { var pri string for i := 0; i < s.reflectType.NumField(); i++ { if s.reflectType.Field(i).Tag.Get("pri") == "1" { pri = strings.ToLower(s.reflectType.Field(i).Name) break } } return pri } func (s *Schema) GetPri() interface{} { return s.pri } func (s *Schema) GetSchema() interface{} { return s.schema } func (s *Schema) Load() error { return s.mgo.Load() } func (s *Schema) Create() error { _, err := s.mgo.Create() return err } func (s *Schema) UpdateProperty(key string, val interface{}) { s.reflectValue.FieldByName(key).Set(reflect.ValueOf(val)) s.mgo.UpdateProperty(key, val) } func (s *Schema) UpdateProperties(properties map[string]interface{}) { for key, val := range properties { s.reflectValue.FieldByName(key).Set(reflect.ValueOf(val)) } s.mgo.UpdateProperties(properties) }