diff --git a/mongoengine/fields.py b/mongoengine/fields.py index b12c507f..b2aab5a4 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -537,7 +537,11 @@ class MapField(BaseField): return dict( [(key,self.field.to_mongo(item)) for key,item in value.iteritems()] ) def prepare_query_value(self, op, value): - return self.field.prepare_query_value(op, value) + if op not in ('set', 'unset'): + return self.field.prepare_query_value(op, value) + for key in value: + value[key] = self.field.prepare_query_value(op, value[key]) + return value def lookup_member(self, member_name): return self.field.lookup_member(member_name) diff --git a/tests/queryset.py b/tests/queryset.py index a2d78d72..82cd870d 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -261,6 +261,44 @@ class QuerySetTest(unittest.TestCase): Blog.drop_collection() + def test_mapfield_update(self): + """Ensure that the MapField can be updated.""" + class Member(EmbeddedDocument): + gender = StringField() + age = IntField() + + class Club(Document): + members = MapField(EmbeddedDocumentField(Member)) + + Club.drop_collection() + + club = Club() + club.members['John'] = Member(gender="M", age=13) + club.save() + + Club.objects().update( + set__members={"John": Member(gender="F", age=14)}) + + club = Club.objects().first() + self.assertEqual(club.members['John'].gender, "F") + self.assertEqual(club.members['John'].age, 14) + + def test_dictfield_update(self): + """Ensure that the MapField can be updated.""" + class Club(Document): + members = DictField() + + club = Club() + club.members['John'] = dict(gender="M", age=13) + club.save() + + Club.objects().update( + set__members={"John": dict(gender="F", age=14)}) + + club = Club.objects().first() + self.assertEqual(club.members['John']['gender'], "F") + self.assertEqual(club.members['John']['age'], 14) + def test_get_or_create(self): """Ensure that ``get_or_create`` returns one result or creates a new document.