diff --git a/docs/changelog.rst b/docs/changelog.rst index 53373302..5a472eb5 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Development =========== +- POTENTIAL BREAKING CHANGE: Aggregate gives wrong results when used with a queryset having limit and skip #2029 - mongoengine now requires pymongo>=3.5 #2017 - Generate Unique Indices for SortedListField and EmbeddedDocumentListFields #2020 - (Fill this out as you fix issues and develop your features). diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 1a5aa1f2..31b1641e 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -5312,13 +5312,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects(age__lte=22).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5358,13 +5354,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.skip(1).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5384,13 +5376,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.limit(1).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5409,13 +5397,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.order_by('name').aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5436,22 +5420,27 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) - data = Person.objects.skip(1).limit(1).aggregate( + data = list( + Person.objects.skip(1).limit(1).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} + ) ) self.assertEqual(list(data), [ {'_id': p2.pk, 'name': "WILSON JUNIOR"}, ]) + # Make sure limit/skip chaining order has no impact + data2 = Person.objects.limit(1).skip(1).aggregate( + {'$project': {'name': {'$toUpper': '$name'}}} + ) + + self.assertEqual(data, list(data2)) + @requires_mongodb_gte_26 def test_queryset_aggregation_with_sort_with_limit(self): class Person(Document): @@ -5461,13 +5450,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.order_by('name').limit(2).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5478,6 +5463,26 @@ class QuerySetTest(unittest.TestCase): {'_id': p3.pk, 'name': "SANDRA MARA"} ]) + # Verify adding limit/skip steps works as expected + data = Person.objects.order_by('name').limit(2).aggregate( + {'$project': {'name': {'$toUpper': '$name'}}}, + {'$limit': 1}, + ) + + self.assertEqual(list(data), [ + {'_id': p1.pk, 'name': "ISABELLA LUANNA"}, + ]) + + data = Person.objects.order_by('name').limit(2).aggregate( + {'$project': {'name': {'$toUpper': '$name'}}}, + {'$skip': 1}, + {'$limit': 1}, + ) + + self.assertEqual(list(data), [ + {'_id': p3.pk, 'name': "SANDRA MARA"}, + ]) + @requires_mongodb_gte_26 def test_queryset_aggregation_with_sort_with_skip(self): class Person(Document): @@ -5487,13 +5492,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.order_by('name').skip(2).aggregate( {'$project': {'name': {'$toUpper': '$name'}}} @@ -5512,13 +5513,9 @@ class QuerySetTest(unittest.TestCase): Person.drop_collection() p1 = Person(name="Isabella Luanna", age=16) - p1.save() - p2 = Person(name="Wilson Junior", age=21) - p2.save() - p3 = Person(name="Sandra Mara", age=37) - p3.save() + Person.objects.insert([p1, p2, p3]) data = Person.objects.order_by('name').skip(1).limit(1).aggregate( {'$project': {'name': {'$toUpper': '$name'}}}