From 6e7fd5336cfd78842ffe477203b7335b435d33a9 Mon Sep 17 00:00:00 2001 From: Nikita Tokarchuk Date: Thu, 16 May 2019 14:18:39 +0200 Subject: [PATCH] Implement reversed preloading --- mongox/common/common.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mongox/common/common.go b/mongox/common/common.go index f639e8e..383e81e 100644 --- a/mongox/common/common.go +++ b/mongox/common/common.go @@ -89,11 +89,16 @@ func createAggregateLoad(db *mongox.Database, target interface{}, composed *quer } preloadLimiter := 100 + preloadReversed := false if len(preloadData) > 2 { - stringLimit := strings.TrimSpace(preloadData[2]) intLimit := preloadLimiter + preloadReversed = strings.HasPrefix(stringLimit, "-") + if preloadReversed { + stringLimit = stringLimit[1:] + } + intLimit, err = strconv.Atoi(stringLimit) if err == nil { preloadLimiter = intLimit @@ -120,6 +125,9 @@ func createAggregateLoad(db *mongox.Database, target interface{}, composed *quer primitive.M{"$match": primitive.M{"$expr": primitive.M{"$eq": primitive.A{"$" + foreignField, "$$selector"}}}}, } + if preloadReversed { + lookupPipeline = append(lookupPipeline, primitive.M{"$sort": primitive.M{"_id": -1}}) + } if isSlice && preloadLimiter > 0 { lookupPipeline = append(lookupPipeline, primitive.M{"$limit": preloadLimiter}) } else if !isSlice {