From 61081651e4f1662e205037b3daa4897e402b924a Mon Sep 17 00:00:00 2001 From: Neeraj Suthar Date: Sat, 6 Apr 2019 17:42:14 +0530 Subject: [PATCH] reinsert fix; add comments, reference --- mongoengine/queryset/base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 24e12623..66e43514 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1200,7 +1200,11 @@ class BaseQuerySet(object): initial_pipeline.append({'$sort': dict(self._ordering)}) if self._limit is not None: - initial_pipeline.append({'$limit': self._limit}) + # As per MongoDB Documentation (https://docs.mongodb.com/manual/reference/operator/aggregation/limit/), + # keeping limit stage right after sort stage is more efficient. But this leads to wrong set of documents + # for a skip stage that might succeed these. So we need to maintain more documents in memory in such a + # case (https://stackoverflow.com/a/24161461). + initial_pipeline.append({'$limit': self._limit + (self._skip or 0)}) if self._skip is not None: initial_pipeline.append({'$skip': self._skip})