2013-07-28 4 views
5

Mam bazę danych organizacji w MongoDB. Próbuję zapisać dane w tej bazie danych, używając mongoengine. Używam serwera Djnago. kiedy tworzę obiekt, to działa dobrze, ale po edycji daje pewien błąd.OperationError: Nie można zapisać dokumentu (LEFT_SUBFIELD obsługuje tylko Object: ancestors.0 not: 7)

class Organization(Document): 
    username= StringField() 
    ancestors = ListField(ReferenceField('Organization',dbref=False), default = list) 
    parents = ListField(ReferenceField('Organization',dbref=False),default = list) 
    descendants = ListField(ReferenceField('Organization',dbref=False), default = list) 


obj1 = Organization(username = 'kousik') 
obj1.save() 
<Organization: Organization object> #obj1 created 

obj2 = Organization(username = 'chowdhury',ancestors = [obj1],parents=[obj1]) 
obj2.save() 
<Organization: Organization object> #obj2 created 

obj3 = Organization(username = 'kchowdhury',ancestors = [obj1,obj2],parents=[obj2]) 
obj3.save() 
<Organization: Organization object> #obj3 creaed 

obj1.descendants = [obj2,obj3] 
obj1.save() 
<Organization: Organization object> #obj1 updated 

obj2.descendants = [obj3] 
obj2.save() 

Traceback (most recent call last): 
    File "<pyshell#43>", line 1, in <module> 
    obj2.save() 
    File "C:\Python27\lib\site-packages\mongoengine\document.py", line 267, in save 
    raise OperationError(message % unicode(err)) 
OperationError: Could not save document (LEFT_SUBFIELD only supports Object: ancestors.0 not: 7) 

Odpowiedz

4

To jest błąd mongoingu. Stworzyłem dla tego problem: https://github.com/MongoEngine/mongoengine/issues/422.

Solutions teraz:

  1. Zastosowanie pełny dokument przeładowania przed aktualizacją (tylko reload nie działają, ponieważ referencies wychodzą):

    obj1 = Organization.objects(username=obj1.username).first() 
    obj1.descendants = [obj2, obj3] 
    obj1.save() 
    
    
    obj2 = Organization.objects(username=obj2.username).first() 
    obj2.descendants = [obj3] 
    obj2.save() 
    
  2. korzystania z aktualizacji atomowe zamiast save.

  3. Zastosowanie to_dbref dla referencies:

    obj1 = Organization(username='kousik') 
    print obj1.save() 
    # <Organization: Organization object> #obj1 created 
    
    obj2 = Organization(username='chowdhury', ancestors=[obj1.to_dbref()], parents=[obj1.to_dbref()]) 
    print obj2.save() 
    # <Organization: Organization object> #obj2 created 
    
    obj3 = Organization(username='kchowdhury', ancestors=[obj1.to_dbref(), obj2.to_dbref()], parents=[obj2.to_dbref()]) 
    print obj3.save() 
    # <Organization: Organization object> #obj3 creaed 
    
    obj1.descendants = [obj2.to_dbref(), obj3.to_dbref()] 
    print obj1.save() 
    # <Organization: Organization object> #obj1 updated 
    
    obj2.descendants = [obj3.to_dbref()] 
    print obj2.save() 
    # <Organization: Organization object> #obj2 updated 
    
+0

Dziękuję bardzo – Nullify

+0

zostanie ustalona w 0.8.4 dzięki @tbicr za bilet – Ross

Powiązane problemy