2013-02-18 3 views
1

클래스를 고려 지원 :매뉴얼 참조

class Person { 
    String name; 
    Person father; 
    Person mother; 
    List<Person> children; 
} 

father, motherchildren이 같은 모음 대신에 포함 된 개체에서 다른 개체에 manual references을해야 jongo을 표시하는 방법이 있나요?

참고 : DBRefs과 다릅니다.

답변

1

아직 없습니다.

가장 쉬운 방법은 두 번째 쿼리를 수동으로 실행하는 것입니다.

그럼에도 불구하고 비 정렬 프로세스 중에 문서를 가져 오기 위해 Jackson de/serializer를 만들 수 있습니다. 몇 달 전, 우리는 unmarhsalling 동안 DBRef를 가져 오는위한 스파이크를 만들었습니다,이 코드가 도움이 될 수 있습니다 Handle DBRef during (un)marshalling

feature request

1

내가 그것을 처리하는 방법을 사용하여 추가하시기 바랍니다. 완벽하지는 않지만 자신을 위해 작동합니다.

의 당신이 이러한 클래스 당신은 설명서를 참조에 "삽입"모음의 ID로 컬렉션 컬렉션 "개체"를 "삽입"및 개체 MyEmbeddedObject을 저장할

public class MyObject { 

    @Id 
    private String id; 
    private MyEmbeddedObject embeddedObject; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public MyEmbeddedObject getEmbeddedObject() { 
     return this.embeddedObject; 
    } 

    public void setEmbeddedObject(MyEmbeddedObject embeddedObject) { 
     this.embeddedObject = embeddedObject; 
    } 

} 


public class MyEmbeddedObject { 

    @Id 
    private String id; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

있다고 가정 해 봅시다. 예를 들어 : Jongo에 등록하여 시리얼 라이저는, 문제는 그것이의 구성원으로 MyEmbeddedObject에 사용될 것입니다 경우

object : { id:1, embeddedObjectId: 99 } 
embed : { id : 99 } 

당신은 MyEmbeddedObject에 대한 사용자 정의 시리얼 라이저 및 디시리얼라이저

public class MyEmbeddedObjectSerializer extends JsonSerializer<MyEmbeddedObject> { 

    @Override 
    public void serialize(MyEmbeddedObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeText(value.getId()); 
    } 
} 

public class MyEmbeddedObjectDeserializer extends JsonDeserializer<MyEmbeddedObject> { 

    @Override 
    public MyEmbeddedObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
     MyEmbeddedObject obj = new MyEmbeddedObject(); 
     obj.setId(jsonParser.getString()); 
     return new MyEmbeddedObject(); 

    } 
} 

을 구현할 수 있습니다 MyObject뿐만 아니라 MyEmbeddedObject 자체가 "embed"컬렉션에 저장 될 때도 마찬가지입니다.

MyEmbeddedObject가 MyOBject에 포함 된 경우에만 사용자 정의 세리 라이자/디시리얼라이저를 적용하려면 Mixin 주석을 사용합니다.

public interface MyObjectMixIn { 

    @JsonSerialize(using=MyEmbeddedObjectSerializer .class) 
    public MyEmbeddedObject getEmbeddedObject(); 

    @JsonDeserialize(using=MyEmbeddedObjectDeserializer.class) 
    public void setEmbeddedObject(MyEmbeddedObject embeddedObject); 

} 

다음 지금

Jongo jongo = new Jongo(db, JacksonMapper.Builder().registerModule(new MyModule()).build()); 

자체로 몽고

  1. 저장합니다 embeddedObject에 저장을 위해 사용하는 Jongo

    에 등록 모듈을 모듈 마침내

    public class MyModule extends SimpleModule { 
        @Override 
        public void setupModule(SetupContext context) { 
         context.setMixInAnnotations(MyObject.class, MyObjectMixIn.class); 
        } 
    } 
    

    정의 컬렉션에서 "embed"ID를 얻으려면

  2. object의 embeddedObject 멤버에 id가 포함되어 있는지 확인하십시오.
  3. "object"컬렉션에 개체를 저장하십시오.만 포함 된 개체의 id는

을 저장됩니다 및 수집 "개체"에서 개체를 읽기

  1. 데이터 저장소

    을 읽을 수 있습니다. 임베디드 객체는 해당 ID로만 초기화됩니다.
  2. 필요한 경우 컬렉션 "임베드"에서 임베디드 객체를 읽습니다.

편집 : 게으른 로딩을 방지하고 직렬화에 전체 개체를로드하기 위해, 잭슨 HandlerInstantiator 목적은 시리얼 라이저 및 디시리얼라이저 건설 메커니즘을 정의하는 데 유용합니다.

희망이 있습니다.