From e9254f471fa596e19fbc7063e15519b08239e392 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Wed, 30 Dec 2009 16:31:33 +0000 Subject: [PATCH] Added average to QuerySet --- mongoengine/queryset.py | 18 ++++++++++++++++++ tests/queryset.py | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 0c52e0a3..551a961d 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -231,6 +231,24 @@ class QuerySet(object): """ return self.exec_js(sum_func, field) + def average(self, field): + """Average over the values of the specified field. + """ + average_func = """ + function(averageField) { + var total = 0.0; + var num = 0; + db[collection].find(query).forEach(function(doc) { + if (doc[averageField]) { + total += doc[averageField]; + num += 1; + } + }); + return total / num; + } + """ + return self.exec_js(average_func, field) + def item_frequencies(self, list_field, normalize=False): """Returns a dictionary of all items present in a list field across the whole queried set of documents, and their corresponding frequency. diff --git a/tests/queryset.py b/tests/queryset.py index c43bb0f7..13e38e4d 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -220,6 +220,19 @@ class QuerySetTest(unittest.TestCase): BlogPost.drop_collection() + def test_average(self): + """Ensure that field can be averaged correctly. + """ + ages = [23, 54, 12, 94, 27] + for i, age in enumerate(ages): + self.Person(name='test%s' % i, age=age).save() + + avg = float(sum(ages)) / len(ages) + self.assertAlmostEqual(int(self.Person.objects.average('age')), avg) + + self.Person(name='ageless person').save() + self.assertEqual(int(self.Person.objects.average('age')), avg) + def test_sum(self): """Ensure that field can be summed over correctly. """