2016-04-14 5 views
0

MongoEngineを使用して埋め込みドキュメントをドキュメントに追加すると、リストは空ですが最初に動作しますが、それ以降は失敗します:mongoengine.errors.OperationError:保存できませんでしたドキュメント(「sensorlist.1.alert_list.0._cls」と「sensorlist.1.alert_list」を同時に更新できません)MongoEngineは埋め込みドキュメントを2回目に保存しません

次のテストコードは、この問題を示しています。一度実行すると、新しいqoo2の埋め込みアラートを持つS2エンベデッドセンサーを持つfooのコレクション/ドキュメント。あなたが再びそれを実行する場合、それは爆発 - 任意のアイデア? 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定義に含まれるクラスを指定する必要があるという問題を指摘した有用な例外情報が表示されました。 ので、修正は次のようにセンサーを定義することです:私はおそらくMongoAlchemyに固執するような小さな問題をめぐるすべてのことの痛みの後

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

関連する問題