2014-11-18 29 views
8

Modeluję bazę danych MongoBD w MongoEngine dla projektu internetowego. Chcę przechowywać dane w nieco nietypowy sposób, aby móc później wydajnie je wysłać.MongoEngine: przechowywanie EmbeddedDocument w DictField

Nasze dane MongoDB wygląda mniej więcej tak:

// "outer" 
{ 
    "outer_data": "directors", 
    "embed": { 
    "some_md5_key": { "name": "P.T. Anderson" }, 
    "another_md5_key": { "name": "T. Malick" }, 
    ... 
    } 
} 

Moim pierwszym odruchem było modelować to tak w 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 

Innymi słowy, to, co w istocie chcą to samo przechowywanie elementu EmbeddedDocument w polu ListField, ale raczej w DictField z dynamicznymi kluczami dla każdego obiektu EmbeddedDocument.

Przykład że pozostawia z ListField odsyłające:

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

że wolą mieć obiektów MongoEngine powrócił do zagnieżdżone „wewnętrzny” dokumenty jednocześnie stosując DictField + EmbeddedDocument (jak dict " wartość"). Jak mogę to modelować w MongoEngine? Czy to jest nawet możliwe, czy muszę naiwnie umieszczać wszystkie dane w generycznym DictField?

Odpowiedz

14

W końcu znalazłem odpowiedź na mój problem. Prawidłowym sposobem uzyskania tego wzoru jest użycie MapField.

Odpowiedni model MongoEngine wygląda następująco:

class Inner(EmbeddedDocument): 
    name = StringField() 

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

W MongoDB, wszystkie klawisze musi być struny, więc nie ma potrzeby, aby określić typ pola „” dla kluczy w MapField.

+2

Próbowałem tego podejścia, ale podczas zapisywania daje mi "Źródłowy obiekt SON musi być typu" dict "". Czy masz rozwiązanie tego, będzie bardzo pomocne. Dzięki – ptwo