From 374b4b22c93401795df4a27d0d729d10a03aa793 Mon Sep 17 00:00:00 2001 From: George Suntres Date: Sat, 25 Apr 2026 12:42:30 -0400 Subject: [PATCH] Add sort to find --- filter.go | 2 ++ find.go | 20 +++++++++++++++----- go.mod | 2 +- go.sum | 12 ++++++------ pipeline.go | 2 +- update_set_test.go | 2 ++ 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/filter.go b/filter.go index 3c96579..76a6992 100644 --- a/filter.go +++ b/filter.go @@ -97,6 +97,8 @@ func mapToOp(v string) string { switch v { case "eq": return "$eq" + case "le": + return "$le" case "includes": return "$regex" default: diff --git a/find.go b/find.go index bc6c5ae..b0ec9a6 100644 --- a/find.go +++ b/find.go @@ -8,9 +8,10 @@ import ( ) type FindOptions struct { - Offset int64 `json:"offset"` - Limit int64 `json:"limit"` - Alias string `json:"alias"` + Offset int64 `json:"offset"` + Limit int64 `json:"limit"` + Alias string `json:"alias"` + Sort [][]any `json:"sort"` } // Find is used to fetch the first page of data. @@ -31,8 +32,15 @@ func (c *MongoClient) Find(ctx context.Context, database, name string, filter bs pageSize := max(limit, c.Limit) - sort := bson.M{"_id": 1} + sortOpts := commons.BsonDFromSlice(opts.Sort) + var sort bson.D + if len(sortOpts) == 0 { + sort = sortOpts + } else { + sort = bson.D{{Key: "_id", Value: 1}} + } + if err := c.DiscriminatorCheckAndApplyToFilter(ctx, name, filter); err != nil { return nil, err } @@ -139,7 +147,9 @@ func (c *MongoClient) FindOffset(ctx context.Context, database, name string, fil Filter: filter, }) - pipeline := BuildPaginationPipeline(offset, finalLimit, f, nil) + sort := commons.BsonDFromSlice(opts.Sort) + + pipeline := BuildPaginationPipeline(offset, finalLimit, f, sort) // 2. Query cursor, err := collection.Aggregate(ctx, pipeline) diff --git a/go.mod b/go.mod index 6cad105..0363b3a 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-20260423193720-28dcfb9e4ce9 + git.gsuntres.com/general/commons v0.0.0-20260425145405-80a923f150d3 git.gsuntres.com/general/events v0.0.0-20260424194951-506e91ff46a2 git.gsuntres.com/general/sys v0.0.1 github.com/go-viper/mapstructure/v2 v2.5.0 diff --git a/go.sum b/go.sum index e84b775..d1c56c6 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,12 @@ 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-20260423193720-28dcfb9e4ce9 h1:wbyyIEMTQqnfE/AfYlzpSwtqbfUW5RP9F6Tt84S7RMI= git.gsuntres.com/general/commons v0.0.0-20260423193720-28dcfb9e4ce9/go.mod h1:S93xcBczrgN+gZU0JWkPRnTcAMvQuTp1ChyKkOd/I50= -git.gsuntres.com/general/events v0.0.0-20260424123722-6d275bca7319 h1:HB3q3hrUOrfREV6eJLIZa++QEyw9i0l3FAGkhRqb5Xs= -git.gsuntres.com/general/events v0.0.0-20260424123722-6d275bca7319/go.mod h1:IQEt0/YT7vYHLTmRhjpqdHgHhagIHZNaay83fndui7s= -git.gsuntres.com/general/events v0.0.0-20260424131043-d6c514c3c113 h1:snNU8UgQ50E1Ud3+hGSJzMZG+Y2ILbcfyF+DEdKDVP0= -git.gsuntres.com/general/events v0.0.0-20260424131043-d6c514c3c113/go.mod h1:IQEt0/YT7vYHLTmRhjpqdHgHhagIHZNaay83fndui7s= -git.gsuntres.com/general/events v0.0.0-20260424131248-c1c5eac835df h1:Ouu8cSqVKJAiJTmyvxeJm6gRjQ7IAhgdbkXDx0SnnHM= -git.gsuntres.com/general/events v0.0.0-20260424131248-c1c5eac835df/go.mod h1:IQEt0/YT7vYHLTmRhjpqdHgHhagIHZNaay83fndui7s= +git.gsuntres.com/general/commons v0.0.0-20260425141140-13c75f62b178 h1:+4W5P1MoGF3cis8/HOHXbfAOVY/7UD59UWcMge9d450= +git.gsuntres.com/general/commons v0.0.0-20260425141140-13c75f62b178/go.mod h1:S93xcBczrgN+gZU0JWkPRnTcAMvQuTp1ChyKkOd/I50= +git.gsuntres.com/general/commons v0.0.0-20260425145405-80a923f150d3 h1:OyKK8RNTKt3exIJjxLvuTd1198TUXyGxbdvKlcLS+DU= +git.gsuntres.com/general/commons v0.0.0-20260425145405-80a923f150d3/go.mod h1:S93xcBczrgN+gZU0JWkPRnTcAMvQuTp1ChyKkOd/I50= +git.gsuntres.com/general/events v0.0.0-20260424194951-506e91ff46a2 h1:nYzjFP7+foDz9GgGMkuiyMjKMm/N7S65zLU8TiTVqHQ= +git.gsuntres.com/general/events v0.0.0-20260424194951-506e91ff46a2/go.mod h1:IQEt0/YT7vYHLTmRhjpqdHgHhagIHZNaay83fndui7s= git.gsuntres.com/general/sys v0.0.1 h1:JpGG6HCkJrTaCICR09kURhMTIc+/s8yb0lHQjo/TDVI= git.gsuntres.com/general/sys v0.0.1/go.mod h1:OVs7w4/tJO1GT7cLIeEsb90LuZqH2xYIVQODI5P1GJs= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= diff --git a/pipeline.go b/pipeline.go index 38ebb12..e4ba149 100644 --- a/pipeline.go +++ b/pipeline.go @@ -5,7 +5,7 @@ import ( "go.mongodb.org/mongo-driver/v2/mongo" ) -func BuildPaginationPipeline(skip, limit int64, filter bson.M, sort bson.M) mongo.Pipeline { +func BuildPaginationPipeline(skip, limit int64, filter bson.M, sort bson.D) mongo.Pipeline { pipe := mongo.Pipeline{ // 1. GLOBAL FILTER: Always filter first to use indexes {{Key: "$match", Value: filter}}, diff --git a/update_set_test.go b/update_set_test.go index 091b8c2..648169c 100644 --- a/update_set_test.go +++ b/update_set_test.go @@ -80,6 +80,8 @@ func TestUpdateSet_WithAudit(t *testing.T) { after := onAudit_after.(bson.M) before["name"] = "** CHANGED USING UPDATE SET **" + delete(before, "updatedAt") + delete(after, "updatedAt") AssertSubset(t, after, before, "Should have been equal") } else {