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 "value" として) を使用しながら、ネストされた "Inner" ドキュメントに対しても 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 に答える