Skip to content

can't pull from embedded document field #131

@dblado

Description

@dblado
django-mongoengine==0.3.3
mongoengine==0.17.0

I have the following models in a Django app:

from django_mongoengine import Document, EmbeddedDocument, fields

class TestEmbModel(EmbeddedDocument):
    list_of_strings = fields.ListField(fields.StringField(), blank=True)

class TestModel(Document):
    some_embedded_doc = fields.EmbeddedDocumentField('TestEmbModel', blank=True)

When using:

a=TestModel()
a.save()

This works:
a.update(add_to_set__some_embedded_doc__list_of_strings='abc')

This does not work:
a.update(pull__some_embedded_doc__list_of_strings='abc')

---------------------------------------------------------------------------
OperationError                            Traceback (most recent call last)
<ipython-input-1-3e6ce99e224a> in <module>()
     14 
     15 a.update(add_to_set__some_embedded_doc__list_of_strings='abc')
---> 16 a.update(pull__some_embedded_doc__list_of_strings='abc')

/Users/dblado/.virtualenvs/vendop/lib/python2.7/site-packages/mongoengine/document.pyc in update(self, **kwargs)
    593 
    594         # Need to add shard key to query, or you get an error
--> 595         return self._qs.filter(**self._object_key).update_one(**kwargs)
    596 
    597     def delete(self, signal_kwargs=None, **write_concern):

/Users/dblado/.virtualenvs/vendop/lib/python2.7/site-packages/mongoengine/queryset/base.pyc in update_one(self, upsert, write_concern, full_result, **update)
    592             write_concern=write_concern,
    593             full_result=full_result,
--> 594             **update)
    595 
    596     def modify(self, upsert=False, full_response=False, remove=False, new=False, **update):

/Users/dblado/.virtualenvs/vendop/lib/python2.7/site-packages/mongoengine/queryset/base.pyc in update(self, upsert, multi, write_concern, full_result, **update)
    541                 message = u'update() method requires MongoDB 1.1.3+'
    542                 raise OperationError(message)
--> 543             raise OperationError(u'Update failed (%s)' % six.text_type(err))
    544 
    545     def upsert_one(self, write_concern=None, **update):

OperationError: Update failed (Cannot apply $pull to a non-array value)

If I change Document, EmbeddedDocument to use mongoengine instead of django_mongoengine it works:

from mongoengine import Document, EmbeddedDocument, fields

I think this is related to MongoEngine/mongoengine#1534

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions