Я моделирую базу данных MongoDB в MongoEngine для веб-проекта. Я хочу хранить данные несколько необычным способом, чтобы иметь возможность эффективно запрашивать их позже.
Наши данные в 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, а скорее в DictField с динамическими ключами для каждого EmbeddedDocument.
Пример того, что разрешено с 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))
Я бы предпочел, чтобы объекты MongoEngine возвращались также для вложенных «внутренних» документов, все еще используя DictField + EmbeddedDocument (как dict «value»). Как я могу смоделировать это в MongoEngine? Возможно ли это вообще, или я должен наивно размещать все данные в общем поле DictField?