2014-09-19 1 views
4

mongoengine.DynamicEmbeddedDocument은 MongoDB의 유연한 스키마없는 디자인을 활용하는 데 사용할 수 있습니다. 그것은 확장 가능하고 필드 제약 조건을 afaik에 적용하지 않습니다.mongoengine.DynamicEmbeddedDocument와 mongoengine.DictField의 차이점은 무엇입니까?

mongoengine.DictField도 마찬가지로 MongoDB의 스키마없는 특성을 사용할 수 있습니다. 문서에서 그들은 간단히 말합니다 (DictField)

이것은 포함 된 문서와 비슷하지만 구조가 정의되어 있지 않습니다.

그 의미합니까, 다음의 mongoengine.fields.DictFieldmongoengine.DynamicEmbeddedDocument 완전히 교환 할 수있다? (기타 정보)

EDIT : 코드이다에서 mongoengine.EmbeddedDocument에서

mongoengine.DynamicEmbeddedDocument 상속

컬렉션 자체에 저장되지 않은 mongoengine.Document. mongoengine.EmbeddedDocumentsmongoengine.Documents에서 mongoengine.EmbeddedDocumentField 필드 유형의 필드로 사용해야합니다. 선언 DOCUMENT_TYPE와 -

mongoengine.fields.EmbeddedDocumentField

내장 된 문서 필드입니다. 유효한 값은 EmbeddedDocument의 서브 클래스입니다.

이는 DictFieldDynamicEmbeddedDocument 완전히 호환되지는 DynamicEmbeddedDocumentEmbeddedDocumentField 필드 유형을 정의 할 수 있다는 것입니다을 만드는 유일한 방법을 의미 하는가?

답변

8

내가 본 것으로부터, 두 개는 비슷하지만 완전히 상호 교환 할 수는 없습니다. 각 접근 방식은 귀하의 필요에 따라 약간의 이점을 가질 수 있습니다. 먼저, 두 가지 접근법은 아래에 표시된 것처럼 문서에서 서로 다른 정의가 필요합니다.

class ExampleDynamicEmbeddedDoc(DynamicEmbeddedDocument): 
    pass 

class ExampleDoc(Document): 
    dict_approach = DictField() 
    dynamic_doc_approach = EmbeddedDocumentField(ExampleDynamicEmbeddedDoc, default = ExampleDynamicEmbeddedDoc()) 

참고 : 기본값은 필요하지 않습니다,하지만 dynamic_doc_approach 필드를 저장하기 위해 ExampleDynamicEmbeddedDoc 객체로 설정해야합니다. (예 : example_doc_instance.dynamic_doc_approach = {} 설정 후 저장하려고하면 예외가 발생합니다). 또한 필드를 특정 유형의 EmbeddedDocument에 연결하지 않으려면 GenericEmbeddedDocumentField를 사용할 수 있지만 저장하려면 필드가 EmbeddedDocument에서 서브 클래 싱 된 객체를 가리킬 필요가 있습니다.

한 번, 두 사용자가 필요에 따라 제한없이 데이터를 저장할 수 있다는 점에서 기능적으로 유사하다 설정 :

e = ExampleDoc() 
e.dict_approach["test"] = 10 
e.dynamic_doc_approach.test = 10 

그러나, 내가 본 하나의 주요 차이점은 당신이 조회 할 수 있다는 것입니다 DictField에 추가 된 모든 값에 반대하는 반면 DynamicEmbeddedDoc에서는 사용할 수 없습니다.

ExampleDoc.objects(dict_approach__test = 10) # Returns a QuerySet containing our entry. 
ExampleDoc.objects(dynamic_doc_approach__test = 10) # Throws an exception. 

즉, EmbeddedDocument를 사용하면 문서에있는 것으로 알고있는 필드의 유효성을 검사 할 수 있다는 이점이 있습니다.(단순히 ExampleDynamicEmbeddedDoc 정의에 추가해야합니다). 이 때문에 필자는 필드의 스키마에 대해 잘 알고 있고 필드를 최소한으로 만 추가 할 것을 기대할 때 DynamicEmbeddedDocument를 사용하는 것이 가장 좋습니다 (쿼리 할 필요가 없음). 그러나 유효성 검사를 염려하지 않거나 쿼리 할 필드를 많이 추가 할 것으로 예상되는 경우 DictField를 사용하십시오.