|
17 | 17 | MONGODB_36, |
18 | 18 | get_mongodb_version, |
19 | 19 | ) |
| 20 | +from mongoengine.pymongo_support import PYMONGO_VERSION |
20 | 21 | from mongoengine.queryset import ( |
21 | 22 | DoesNotExist, |
22 | 23 | MultipleObjectsReturned, |
@@ -2328,6 +2329,46 @@ class BlogPost(Document): |
2328 | 2329 | post.reload() |
2329 | 2330 | assert post.slug == "When test test it" |
2330 | 2331 |
|
| 2332 | + def test_combination_of_mongoengine_and__raw__(self): |
| 2333 | + """Ensure that the '__raw__' update/query works in combination with mongoengine syntax correctly.""" |
| 2334 | + |
| 2335 | + class BlogPost(Document): |
| 2336 | + slug = StringField() |
| 2337 | + foo = StringField() |
| 2338 | + tags = ListField(StringField()) |
| 2339 | + |
| 2340 | + BlogPost.drop_collection() |
| 2341 | + |
| 2342 | + post = BlogPost(slug="test", foo="bar") |
| 2343 | + post.save() |
| 2344 | + |
| 2345 | + BlogPost.objects(slug="test").update( |
| 2346 | + foo="baz", |
| 2347 | + __raw__={"$set": {"slug": "test test"}}, |
| 2348 | + ) |
| 2349 | + post.reload() |
| 2350 | + assert post.slug == "test test" |
| 2351 | + assert post.foo == "baz" |
| 2352 | + |
| 2353 | + assert BlogPost.objects(foo="baz", __raw__={"slug": "test test"}).count() == 1 |
| 2354 | + assert ( |
| 2355 | + BlogPost.objects(foo__ne="bar", __raw__={"slug": {"$ne": "test"}}).count() |
| 2356 | + == 1 |
| 2357 | + ) |
| 2358 | + assert ( |
| 2359 | + BlogPost.objects(foo="baz", __raw__={"slug": {"$ne": "test test"}}).count() |
| 2360 | + == 0 |
| 2361 | + ) |
| 2362 | + assert ( |
| 2363 | + BlogPost.objects(foo__ne="baz", __raw__={"slug": "test test"}).count() == 0 |
| 2364 | + ) |
| 2365 | + assert ( |
| 2366 | + BlogPost.objects( |
| 2367 | + foo__ne="baz", __raw__={"slug": {"$ne": "test test"}} |
| 2368 | + ).count() |
| 2369 | + == 0 |
| 2370 | + ) |
| 2371 | + |
2331 | 2372 | def test_add_to_set_each(self): |
2332 | 2373 | class Item(Document): |
2333 | 2374 | name = StringField(required=True) |
@@ -2739,6 +2780,44 @@ def test_order_by_chaining(self): |
2739 | 2780 | ages = [p.age for p in qs] |
2740 | 2781 | assert ages == [40, 30, 20] |
2741 | 2782 |
|
| 2783 | + def test_order_by_using_raw(self): |
| 2784 | + person_a = self.Person(name="User A", age=20) |
| 2785 | + person_a.save() |
| 2786 | + person_b = self.Person(name="User B", age=30) |
| 2787 | + person_b.save() |
| 2788 | + person_c = self.Person(name="User B", age=25) |
| 2789 | + person_c.save() |
| 2790 | + person_d = self.Person(name="User C", age=40) |
| 2791 | + person_d.save() |
| 2792 | + |
| 2793 | + qs = self.Person.objects.order_by(__raw__=[("name", pymongo.DESCENDING)]) |
| 2794 | + assert qs._ordering == [("name", pymongo.DESCENDING)] |
| 2795 | + names = [p.name for p in qs] |
| 2796 | + assert names == ["User C", "User B", "User B", "User A"] |
| 2797 | + |
| 2798 | + names = [ |
| 2799 | + (p.name, p.age) |
| 2800 | + for p in self.Person.objects.order_by(__raw__=[("name", pymongo.ASCENDING)]) |
| 2801 | + ] |
| 2802 | + assert names == [("User A", 20), ("User B", 30), ("User B", 25), ("User C", 40)] |
| 2803 | + |
| 2804 | + if PYMONGO_VERSION >= (4, 4): |
| 2805 | + # Pymongo >= 4.4 allow to mix single key with tuples inside the list |
| 2806 | + qs = self.Person.objects.order_by( |
| 2807 | + __raw__=["name", ("age", pymongo.ASCENDING)] |
| 2808 | + ) |
| 2809 | + names = [(p.name, p.age) for p in qs] |
| 2810 | + assert names == [ |
| 2811 | + ("User A", 20), |
| 2812 | + ("User B", 25), |
| 2813 | + ("User B", 30), |
| 2814 | + ("User C", 40), |
| 2815 | + ] |
| 2816 | + |
| 2817 | + def test_order_by_using_raw_and_keys_raises_exception(self): |
| 2818 | + with pytest.raises(OperationError): |
| 2819 | + self.Person.objects.order_by("-name", __raw__=[("age", pymongo.ASCENDING)]) |
| 2820 | + |
2742 | 2821 | def test_confirm_order_by_reference_wont_work(self): |
2743 | 2822 | """Ordering by reference is not possible. Use map / reduce.. or |
2744 | 2823 | denormalise""" |
|
0 commit comments