Python MongoEngine:将嵌入的文档存储在域中

Python MongoEngine:将嵌入的文档存储在域中,python,mongodb,mongoengine,flask-mongoengine,nosql,Python,Mongodb,Mongoengine,Flask Mongoengine,Nosql,我正在MongoEngine中为一个web项目建模一个MongoDB数据库。我希望以一种稍微不同寻常的方式存储数据,以便以后能够高效地查询它 MongoDB中的数据如下所示: // "outer" { "outer_data": "directors", "embed": { "some_md5_key": { "name": "P.T. Anderson" }, "another_md5_key": { "name": "T. Malick" }, .

我正在MongoEngine中为一个web项目建模一个MongoDB数据库。我希望以一种稍微不同寻常的方式存储数据,以便以后能够高效地查询它

MongoDB中的数据如下所示:

// "outer"
{  
  "outer_data": "directors",
  "embed": {
     "some_md5_key": { "name": "P.T. Anderson" },
     "another_md5_key": { "name": "T. Malick" },
     ...
   }
}
我的第一反应是在MongoEngine中对其进行如下建模:

class Inner(EmbeddedDocument):
  name = StringField()

class Outer(Document):
  outer_data = StringField()
  embed = DictField(EmbeddedDocument(Inner))  # this isn't allowed but you get the point
换句话说,我本质上想要的是在ListField中存储嵌入的文档,而不是在DictField中,每个嵌入的文档都有动态键

允许使用列表字段进行引用的示例:

class Inner(EmbeddedDocument):
  inner_id = StringField(unique=True)  # this replaces the dict keys
  name = StringField()

class Outer(Document):
  outer_data = StringField()
  embed = ListField(EmbeddedDocument(Inner))

我更希望在仍然使用DictField+EmbeddedDocument(作为dict“value”)的情况下,为嵌套的“内部”文档返回MongoEngine对象。如何在MongoEngine中对此进行建模?甚至有可能或者我必须天真地将所有数据放在一个通用字段下吗?

我终于找到了问题的答案。实现此模式的正确方法是使用

MongoEngine中相应的模型如下所示:

class Inner(EmbeddedDocument):
  name = StringField()

class Outer(Document):
  outer_data = StringField()
  embed = MapField(EmbeddedDocumentField(Inner))

在MongoDB中,所有键都需要是字符串,因此无需为
MapField

中的键指定“字段类型”,我尝试了这种方法,但在保存它时,给出了“源子对象需要是'dict'类型”。你有没有解决这个问题的办法会很有帮助。谢谢你,这是一本字典。所以,
embed=ListField(EmbeddedDocumentField(Inner))
对我有用