2016-04-14 64 views
0

當我使用MongoEngine向文檔中添加嵌入式文檔時,它在列表爲空時第一次運行,但隨後的嘗試失敗,說:mongoengine.errors.OperationError:無法保存文檔(無法同時更新'sensorlist.1.alert_list.0._cls'和'sensorlist.1.alert_list')MongoEngine第二次沒有保存嵌入式文檔

以下測試代碼演示了此問題:如果您運行它,一旦您將看到新的foo中的集合/文檔具有S2嵌入式傳感器和2個嵌入式警報。如果你再次運行它會炸燬 - 任何想法? THX比爾

import mongoengine as ME 
ME.connect('foo') 

class Sensor(ME.EmbeddedDocument): 
    name = ME.StringField() 
    alert_list = ME.ListField() 

class Alert(ME.EmbeddedDocument): 
    name = ME.StringField(default = 'new alert') 

class SiteConfig(ME.Document): 
    siteid = ME.StringField() 
    sensorlist = ME.ListField(ME.EmbeddedDocumentField(Sensor)) 

if not SiteConfig.objects(siteid = '123456'): 
    newsite = SiteConfig(siteid = '123456') 
    newsite.save() 
    print("saved new site") 


site = SiteConfig.objects(siteid = '123456').first() 
newsensor = Sensor(name='S1') 
site.sensorlist.append(newsensor) 
site.save() 
print("added sensor S1") 

newsensor = Sensor(name='S2') 
site.sensorlist.append(newsensor) 
site.save() 
print("added sensor S2") 

for sensor in site.sensorlist: 
    if sensor.name =='S2': 
     alert = Alert() 
     sensor.alert_list.append(alert) 

site.save() 
print('added first alert to S2') 

for sensor in site.sensorlist: 
    if sensor.name =='S2': 
     alert = Alert() 
     sensor.alert_list.append(alert) 

site.save() 
print('added second alert to S1') 

回答

0

我通過再現MongoAlchemy的代碼非常相似解決了這個。這也失敗了,但實際上給了我有用的異常信息,指出我的Sensor類Alert_list定義需要指定它所包含的類。 所以解決方法是這樣定義傳感器:

class Sensor(ME.DynamicEmbeddedDocument): 
    name = ME.StringField() 
    alert_list = ME.ListField(ME.EmbeddedDocumentField(Alert)) 

之後所有的痛苦在這樣一個小問題,我可能會用MongoAlchemy棒!