diff --git a/mongox/database/loadarray.go b/mongox/database/loadarray.go index d3d8671..b73c301 100644 --- a/mongox/database/loadarray.go +++ b/mongox/database/loadarray.go @@ -78,12 +78,25 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er value := reflect.New(targetSliceElemT.Elem()) err = result.Decode(value.Interface()) elem = value.Interface() + + err = composed.OnCreate().Invoke(ctx, elem) + if err != nil { + return + } + if err == nil { targetSliceV = reflect.Append(targetSliceV, value) } } else { elem = targetSliceV.Index(i).Interface() - base.Reset(elem) + + if created := base.Reset(elem); created { + err = composed.OnCreate().Invoke(ctx, elem) + } + if err != nil { + return + } + err = result.Decode(elem) } if err != nil { diff --git a/mongox/database/loadone.go b/mongox/database/loadone.go index e9db17d..216e696 100644 --- a/mongox/database/loadone.go +++ b/mongox/database/loadone.go @@ -56,7 +56,12 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) (err erro return mongox.ErrNoDocuments } - base.Reset(target) + if created := base.Reset(target); created { + err = composed.OnCreate().Invoke(ctx, target) + } + if err != nil { + return + } err = result.Decode(target) if err != nil { diff --git a/mongox/database/streamloader.go b/mongox/database/streamloader.go index 6bd5d19..43d6d30 100644 --- a/mongox/database/streamloader.go +++ b/mongox/database/streamloader.go @@ -35,7 +35,12 @@ func (l *StreamLoader) DecodeNext() (err error) { // Decode function decodes the current cursor document into the target func (l *StreamLoader) Decode() (err error) { - base.Reset(l.target) + if created := base.Reset(l.target); created { + err = l.query.OnDecode().Invoke(l.ctx, l.target) + } + if err != nil { + return + } err = l.cur.Decode(l.target) if err != nil { diff --git a/mongox/query/query.go b/mongox/query/query.go index 3c20053..7d658a1 100644 --- a/mongox/query/query.go +++ b/mongox/query/query.go @@ -17,6 +17,7 @@ type Query struct { updater Updater ondecode Callbacks onclose Callbacks + oncreate Callbacks } // And function pushes the elem query to the $and array of the query @@ -122,6 +123,11 @@ func (q *Query) OnClose() (callbacks Callbacks) { return q.onclose } +// OnCreate callback is called if the mongox creates a new document instance during loading +func (q *Query) OnCreate() (callbacks Callbacks) { + return q.onclose +} + // Empty checks the query for any content func (q *Query) Empty() (isEmpty bool) { return len(q.m) == 0