Поддержка ручных ссылок

Рассмотрим класс:

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

Есть ли способ указать Джонго, что father, mother и children должны быть ручные ссылки на другие объекты в той же коллекции вместо встроенных объектов?

Примечание. Это отличается от DBRefs.


person assylias    schedule 18.02.2013    source источник


Ответы (2)


Еще нет.

Самый простой способ — выполнить второй запрос вручную.

Тем не менее, вы можете создать де/сериализатор Джексона для извлечения документов во время процесса десортировки. Несколько месяцев назад мы создали всплеск для получения DBRef во время разупорядочения, этот код может помочь: (не)сортировка

Вы можете добавить запрос функции.

person Benoît Guérout    schedule 19.02.2013

Я использую способ справиться с этим. Не уверен, что это идеально, но это работает для меня.

Допустим, у вас есть эти классы

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;
    }

}

Вы хотите сохранить MyEmbeddedObject в коллекции "embed" и объект в коллекции "object" с ручной ссылкой на идентификаторы коллекции "embed". Например :

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

    }
 }

Если вы зарегистрируете свой сериализатор в Jongo, проблема заключается в том, что он будет использоваться для MyEmbeddedObject как член MyObject, а также для MyEmbeddedObject, когда он хранится сам по себе в коллекции «встроить».

Чтобы применять пользовательские сериализаторы/десериализаторы только тогда, когда MyEmbeddedObject встроен в MyOBject, я использую аннотации Mixin.

public interface MyObjectMixIn {

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

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

}

Затем определите модуль

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

Наконец, зарегистрируйте модуль в Jongo.

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

Теперь, чтобы использовать его для хранения в Mongo

  1. Сохраните встроенный объект отдельно в коллекции «embed», чтобы получить идентификатор
  2. Убедитесь, что элемент embeddedObject объекта содержит идентификатор
  3. Сохраните объект в коллекции «объект». Будет сохранен только идентификатор встроенного объекта

И читать хранилище данных

  1. Прочитать объект из коллекции "object". Вложенный объект будет инициализирован только с его идентификатором
  2. Если вам это нужно, прочитайте встроенный объект в коллекции «вставить».

РЕДАКТИРОВАТЬ: чтобы избежать ленивой загрузки и загрузки всего объекта при десериализации, объект HandlerInstantiator от Jackson полезен для настройки сериализатора. и механизм построения десериализатора.

Надеюсь, это поможет.

person Thomas    schedule 05.11.2013