diff --git a/discrimination.go b/discrimination.go index 97d6adc..03a78bd 100644 --- a/discrimination.go +++ b/discrimination.go @@ -11,6 +11,10 @@ import ( func (c *MongoClient) DiscriminatorCheckAndApplyToData(ctx context.Context, name string, data map[string]any) error { cdef, ok := c.Registry[name] if ok && cdef.Discriminator != nil { + if data == nil { + data = map[string]any{} + } + log.Printf("Discriminator found for %s; will use it", name) // get from context @@ -30,6 +34,10 @@ func (c *MongoClient) DiscriminatorCheckAndApplyToData(ctx context.Context, name func (c *MongoClient) DiscriminatorCheckAndApplyToFilter(ctx context.Context, name string, filter bson.M) error { cdef, ok := c.Registry[name] if ok && cdef.Discriminator != nil { + if filter == nil { + filter = bson.M{} + } + log.Printf("Discriminator found for %s; will use it", name) // get from context diff --git a/filter.go b/filter.go index cdea321..c076426 100644 --- a/filter.go +++ b/filter.go @@ -3,13 +3,13 @@ package mongo import "log" type Query struct { - Filter map[string]any + Filter map[string]any `json:"filter"` } type Filter struct { - Name string - Op string - Value string + Name string `json:"name"` + Op string `json:"op"` + Value string `json:"value"` } func makeFilter(name string, value any) *Filter { @@ -64,7 +64,7 @@ func Mongofy(q *Query) map[string]any { } if len(conditions) == 0 { - return nil + return map[string]any{} } if logic == "or" { diff --git a/find.go b/find.go index 32c76b1..a52917d 100644 --- a/find.go +++ b/find.go @@ -4,6 +4,7 @@ import ( "context" "go.mongodb.org/mongo-driver/v2/bson" + "git.gsuntres.com/general/commons" ) // Find is used to fetch the first page of data. @@ -89,10 +90,14 @@ func (c *MongoClient) FindOffset(ctx context.Context, database, name string, fil finalLimit := max(limit, c.Limit) + if err := c.DiscriminatorCheckAndApplyToFilter(ctx, name, filter); err != nil { + return nil, err + } + f := Mongofy(&Query{ Filter: filter, }) - + pipeline := BuildPaginationPipeline(offset, finalLimit, f, nil) // 2. Query @@ -116,8 +121,8 @@ func (c *MongoClient) FindOffset(ctx context.Context, database, name string, fil var totalValue any if len(metadata) != 0 { - metadataRoot := metadata[0].(bson.M) - totalValue = metadataRoot["total"] + metadataRoot := metadata[0].(bson.D) + totalValue, _ = commons.BsonDGetAny(metadataRoot, "total") } var total int64 diff --git a/go.mod b/go.mod index 7083fad..6f8eb10 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.gsuntres.com/general/mongo go 1.25.0 require ( - git.gsuntres.com/general/commons v0.0.0-20260416141603-7a6c5b6c3c8c + git.gsuntres.com/general/commons v0.0.0-20260418004121-f52793a7641f git.gsuntres.com/general/sys v0.0.0-20260329160429-49966ca31027 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/go-cmp v0.7.0 diff --git a/go.sum b/go.sum index 020a1de..adf69ec 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= git.gsuntres.com/general/commons v0.0.0-20260416141603-7a6c5b6c3c8c h1:3jh+CfW0j4JQOa1tRN7UFWcbv5LxBRdHAeM8SoPDbJM= git.gsuntres.com/general/commons v0.0.0-20260416141603-7a6c5b6c3c8c/go.mod h1:ZawSPCI/Irjx7P83qJRcknKGuLLJ9c7hhP4OXgILnCY= +git.gsuntres.com/general/commons v0.0.0-20260418004121-f52793a7641f h1:lSjhzGQBpON/Cc+wXZXcMrpgm0RQ+waipLoC/abmX7I= +git.gsuntres.com/general/commons v0.0.0-20260418004121-f52793a7641f/go.mod h1:ZawSPCI/Irjx7P83qJRcknKGuLLJ9c7hhP4OXgILnCY= git.gsuntres.com/general/sys v0.0.0-20260329160429-49966ca31027 h1:4pmcjxEDM4rzv+iimQ7wTgCAQ1VnAoeGiHLuf6wC6Fw= git.gsuntres.com/general/sys v0.0.0-20260329160429-49966ca31027/go.mod h1:OVs7w4/tJO1GT7cLIeEsb90LuZqH2xYIVQODI5P1GJs= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= diff --git a/main.go b/main.go index 76e2f17..1d302c2 100644 --- a/main.go +++ b/main.go @@ -232,6 +232,7 @@ type MongoStartProps struct { MongoPass string MongoDebugQuery bool MongoDBPrefix string + AllowTruncatingDoubles bool } func Start(props *MongoStartProps) error { @@ -262,7 +263,10 @@ func Start(props *MongoStartProps) error { NilSliceAsEmpty: true, NilMapAsEmpty: true, }). - SetRegistry(GetCustomRegistry()) + SetRegistry(GetCustomRegistry()). + SetBSONOptions(&options.BSONOptions{ + AllowTruncatingDoubles: props.AllowTruncatingDoubles, + }) client.DebugQuery = props.MongoDebugQuery if client.DebugQuery { diff --git a/replace.go b/replace.go index fdd305d..1469f5e 100644 --- a/replace.go +++ b/replace.go @@ -23,7 +23,7 @@ func (c *MongoClient) Replace(ctx context.Context, database, name string, id str if err := c.DiscriminatorCheckAndApplyToData(ctx, name, data); err != nil { return nil, err } - + updateResult, err := collection.ReplaceOne(ctx, filter, data) if err != nil { return nil, err