diff --git a/mongox/pagination.go b/mongox/pagination.go index c168df0..188f433 100644 --- a/mongox/pagination.go +++ b/mongox/pagination.go @@ -8,6 +8,7 @@ import ( "github.com/reearth/reearthx/rerror" "github.com/reearth/reearthx/usecasex" "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -40,8 +41,15 @@ func (c *Collection) Paginate(ctx context.Context, rawFilter any, s *usecasex.So sortOrder *= -1 } + var sort primitive.D + if sortKey == idKey { + sort = bson.D{{Key: sortKey, Value: sortOrder}} + } else { + sort = bson.D{{Key: sortKey, Value: sortOrder}, {Key: idKey, Value: sortOrder}} + } + findOpts := options.Find(). - SetSort(bson.D{{Key: sortKey, Value: sortOrder}, {Key: idKey, Value: sortOrder}}). + SetSort(sort). SetLimit(limit(*p)) if p.Offset != nil { @@ -199,11 +207,11 @@ func (c *Collection) aggregateFilter(ctx context.Context, p usecasex.Pagination, } func aggregateOptionsFromPagination(_ usecasex.Pagination, _ *usecasex.Sort) *options.AggregateOptions { - collation := options.Collation{ - Locale: "en", - Strength: 2, - } - return options.Aggregate().SetAllowDiskUse(true).SetCollation(&collation) + collation := options.Collation{ + Locale: "en", + Strength: 2, + } + return options.Aggregate().SetAllowDiskUse(true).SetCollation(&collation) } func (c *Collection) pageFilter(ctx context.Context, p usecasex.Pagination, s *usecasex.Sort) (bson.M, error) { @@ -280,11 +288,11 @@ func (c *Collection) getCursorDocument(ctx context.Context, cursor usecasex.Curs } func sortFilter(p usecasex.Pagination, s *usecasex.Sort) bson.D { - var sortOptions bson.D - if s != nil && s.Key != "" && s.Key != idKey { - sortOptions = append(sortOptions, bson.E{Key: s.Key, Value: sortDirection(p, s)}) - } - return append(sortOptions, bson.E{Key: idKey, Value: sortDirection(p, s)}) + var sortOptions bson.D + if s != nil && s.Key != "" && s.Key != idKey { + sortOptions = append(sortOptions, bson.E{Key: s.Key, Value: sortDirection(p, s)}) + } + return append(sortOptions, bson.E{Key: idKey, Value: sortDirection(p, s)}) } func limit(p usecasex.Pagination) int64 {