mongoengine icon indicating copy to clipboard operation
mongoengine copied to clipboard

Mongoengine makes conflicting modifications to embedded documents

Open bremac opened this issue 8 years ago • 7 comments

Some embedded document structures trip up delta tracking and cause saves to fail. For example, take the following script:

import mongoengine

class EmbeddedDoc(mongoengine.EmbeddedDocument):
    content = mongoengine.StringField()
    docs = mongoengine.ListField(mongoengine.EmbeddedDocumentField('EmbeddedDoc'))

class Doc(mongoengine.Document):
    docs = mongoengine.ListField(mongoengine.EmbeddedDocumentField(EmbeddedDoc))

mongoengine.connect('test')
Doc.objects.delete()

d = Doc()
d.docs = [EmbeddedDoc(content='1', docs=[])]
d.save()

d = Doc.objects[0]
e = EmbeddedDoc()
e.content = '2'
d.docs[0].docs.insert(0, e)
d.save()

The final call to save() fails with an error:

Traceback (most recent call last):
  File "break-mongoengine.py", line 24, in <module>
    d.save()
  File "/home/sm/Code/ma/venv/src/mongoengine/mongoengine/document.py", line 372, in save
    raise OperationError(message % six.text_type(err))
mongoengine.errors.OperationError: Could not save document (Cannot update 'docs.0.docs.0.content' and 'docs.0.docs' at the same time)

bremac avatar Mar 13 '17 22:03 bremac