diff --git a/document.go b/document.go index 7824d25..b76d561 100644 --- a/document.go +++ b/document.go @@ -96,13 +96,15 @@ func (d *Document) Save() error { if val.Kind() == reflect.Slice { for i := 0; i < val.Len(); i++ { cur := val.Index(i) - if err := doSave(d.model.getColl(), !d.exists, cur.Interface()); err != nil { + asHId := asId(cur.Interface()) + if err := doSave(d.model.getColl(), !d.exists && reflect.ValueOf(asHId.Id()).IsZero(), cur.Interface()); err != nil { return err } } return nil } else { - return doSave(d.model.getColl(), !d.exists, d.self) + asHId := asId(val.Interface()) + return doSave(d.model.getColl(), !d.exists && reflect.ValueOf(asHId.Id()).IsZero(), d.self) } } diff --git a/util.go b/util.go index 9cd910a..fff292d 100644 --- a/util.go +++ b/util.go @@ -39,6 +39,27 @@ func valueOf(i interface{}) reflect.Value { return v } +func asId(i interface{}) HasID { + v := reflect.ValueOf(i) + var asHasId HasID + var ok bool + switch v.Kind() { + case reflect.Struct: + v = reflect.New(reflect.PointerTo(v.Type())) + fallthrough + case reflect.Pointer: + asHasId, ok = v.Interface().(HasID) + if ok { + return asHasId + } else { + panic("value does not implemenet `HasId`!") + } + default: + break + } + return asHasId +} + func coerceInt(input reflect.Value, dst reflect.Value) interface{} { if input.Type().Kind() == reflect.Pointer { input = input.Elem()