【问题标题】:MongoEngine not saving embedded doc second time aroundMongoEngine 没有第二次保存嵌入式文档
【发布时间】:2016-04-15 21:36:25
【问题描述】:

当我使用 MongoEngine 将嵌入式文档添加到文档时,它在列表为空时第一次工作,但随后尝试失败并显示:mongoengine.errors.OperationError:无法保存文档(无法更​​新 'sensorlist.1 .alert_list.0._cls' 和 'sensorlist.1.alert_list')

以下测试代码演示了该问题:如果您运行一次,您将在 foo 中看到一个新集合/文档,该集合/文档具有 S2 嵌入式传感器和 qty 2 个嵌入式警报。如果你再次运行它,它会爆炸 - 有什么想法吗? 谢谢比尔

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')

【问题讨论】:

    标签: mongodb mongoengine


    【解决方案1】:

    我通过重现非常相似的 MongoAlchemy 中的代码解决了这个问题。这也失败了,但实际上给了我有用的异常信息,指出了我的传感器类 Alert_list 定义需要指定它包含的类的问题。 所以解决方法是像这样定义 Sensor:

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

    在为这么一个小问题而痛苦之后,我可能会坚持使用 MongoAlchemy!

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2019-05-28
      相关资源
      最近更新 更多