13

我正在为 Web 项目在 MongoEngine 中建模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

换句话说,我本质上想要的是将 EmbeddedDocument 存储在 ListField 中,而不是存储在每个 EmbeddedDocument 的动态键的 DictField 中。

允许使用 ListField 以供参考的示例:

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“值”)的同时为嵌套的“内部”文档返回 MongoEngine 对象。如何在 MongoEngine 中建模?甚至有可能还是我必须天真地将所有数据放在通用 DictField 下?

4

1 回答 1

23

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

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

class Inner(EmbeddedDocument):
  name = StringField()

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

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

于 2014-11-19T16:45:39.557 回答