2014-11-18 4 views
8

웹 프로젝트를 위해 MongoEngine에서 MongoBD 데이터베이스를 모델링하고 있습니다. 나중에 효율적으로 쿼리 할 수 ​​있도록 약간 특이한 방식으로 데이터를 저장하려고합니다. MongoDB의에서MongoEngine : DictField에 EmbeddedDocument 저장

우리의 데이터는 다음과 같은 :

// "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에 임베디드 문서를 저장하는 것.

은 참조를 위해의 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)) 
난 여전히 "DICT의 (a DictField + EmbeddedDocument를 사용하는 동안 MongoEngine 객체가 중첩 된"내부 "문서를 함께 반환해야하는 것을 선호

값"). MongoEngine에서 이것을 어떻게 모델화 할 수 있습니까? 그것은 가능합니까 아니면 모든 데이터를 일반 DictField에 순진하게 배치해야합니까?

답변

14

마침내 내 문제에 대한 해결책을 찾았습니다. 이 패턴을 얻는 올바른 방법은 MapField을 사용하는 것입니다.

하여 MongoDB에서
class Inner(EmbeddedDocument): 
    name = StringField() 

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

, 모든 키가 MapField에있는 키의 "필드 유형"을 지정할 필요가 없습니다 그래서 문자열을 할 필요가 : 같은

MongoEngine의 해당 모델은 보인다.

+2

나는이 접근법을 시도했지만 저장하면서 "원본 SON 개체는 'dict'유형이어야합니다. 이 문제에 대한 해결책은 매우 유용 할 것입니다. 감사 – ptwo