From 0bc6507df34710de0a8fb16b0b45f48d8d6aec5b Mon Sep 17 00:00:00 2001 From: Benoit Larroque Date: Tue, 27 Jun 2017 00:43:41 +0200 Subject: [PATCH] Make queryset aggregates obey read_preference --- mongoengine/queryset/base.py | 4 ++++ tests/queryset/queryset.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 6f9c372c..090ed906 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1182,6 +1182,10 @@ class BaseQuerySet(object): pipeline = initial_pipeline + list(pipeline) + if IS_PYMONGO_3 and self._read_preference is not None: + return self._collection.with_options(read_preference=self._read_preference) \ + .aggregate(pipeline, cursor={}, **kwargs) + return self._collection.aggregate(pipeline, cursor={}, **kwargs) # JS functionality diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index d97b307d..e0eb7d38 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4353,6 +4353,26 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(bars._cursor._Cursor__read_preference, ReadPreference.SECONDARY_PREFERRED) + @needs_mongodb_v26 + def test_read_preference_aggregation_framework(self): + class Bar(Document): + txt = StringField() + + meta = { + 'indexes': ['txt'] + } + # Aggregates with read_preference + bars = Bar.objects \ + .read_preference(ReadPreference.SECONDARY_PREFERRED) \ + .aggregate() + if IS_PYMONGO_3: + self.assertEqual(bars._CommandCursor__collection.read_preference, + ReadPreference.SECONDARY_PREFERRED) + else: + self.assertNotEqual(bars._CommandCursor__collection.read_preference, + ReadPreference.SECONDARY_PREFERRED) + + def test_json_simple(self): class Embedded(EmbeddedDocument):