MongoEngine第二次没有保存嵌入式文档
问题描述:
当我使用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')
答
我通过再现MongoAlchemy的代码非常相似解决了这个。这也失败了,但实际上给了我有用的异常信息,指出我的Sensor类Alert_list定义需要指定它所包含的类。 所以解决方法是这样定义传感器:
class Sensor(ME.DynamicEmbeddedDocument):
name = ME.StringField()
alert_list = ME.ListField(ME.EmbeddedDocumentField(Alert))
之后所有的痛苦在这样一个小问题,我可能会用MongoAlchemy棒!