MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Spring Data Mongo - Как да картографирате наследени POJO обекти?

Аз сам ще отговоря на въпроса си. Както бе споменато в коментарите, решението е да използвате Converter .

Ето пример за това, което възнамерявах да постигна с моя модел на клас:

Contact може да бъде или Person или Organisation .

Ако използвате spring-data-mongodb MongoRepository за запис на данни във вашата база данни според вашия модел на обект, _class полето ще бъде добавено към корените на документа и към сложните типове свойства (вижте този раздел ). Тези полета съхраняват напълно квалифицираното име на Java класа и позволяват недвусмисленост при съпоставяне от MongoDb документ към Spring модел на данни.

Ако приложението ви просто прочете документа от базата данни (без _class полета), трябва да кажете на данните на Spring кой клас да инстанцира, когато картографирате Contact . Spring-data ви позволява да персонализирате поведението на съпоставяне на типа по подразбиране с помощта на Converter . Използване на явен Converter замяна по подразбиране картографиране за клас . трябва изрично да картографирате целия си клас. Ето пример за моя ContactReadConverter :

@ReadingConverter
public class ContactReadConverter implements Converter<Document, Contact> {

    @Override
    public Contact convert(Document source) {
        if (source.get("firstName") == null) {
            Organisation organisation = new Organisation();
            I18n name = new I18n();
            name.setEn(source.get("name", Document.class).get("en", String.class));
            name.setFr(source.get("name", Document.class).get("fr", String.class));
            organisation.setName(name);
            organisation.setAcronym(source.get("acronym", String.class));
            organisation.setRole(source.get("role", String.class));
            return organisation;
        }
        Person person = new Person();
        person.setFirstName(source.get("firstName", String.class));
        person.setLastName(source.get("lastName", String.class));
        person.setRole(source.get("role", String.class));
        person.setEmail(source.get("email", String.class));
        person.setOrcId(source.get("orcId", String.class));
        if (source.get("organisation") != null) {
            Document sourceOrg = source.get("organisation", Document.class);
            Organisation organisation = new Organisation();
            organisation.setAcronym(sourceOrg.get("acronym", String.class));
            organisation.setRole(sourceOrg.get("role", String.class));
            if (sourceOrg.get("name") != null) {
                I18n name = new I18n();
                name.setFr(sourceOrg.get("name", Document.class).get("fr", String.class));
                name.setEn(sourceOrg.get("name", Document.class).get("en", String.class));
                organisation.setName(name);
            }
            person.setOrganisation(organisation);
        }
        return person;
    }
}

След това новодефинираните конвертори трябва да бъдат регистрирани:

@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {
    @Value("${spring.data.mongodb.uri}")
    private String uri;
    @Value("${spring.data.mongodb.database}")
    private String database;
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(uri));
    }
    @Override
    protected String getDatabaseName() {
        return database;
    }    
    @Bean
    @Override
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<>();
        converterList.add(new ContactReadConverter());
        return new MongoCustomConversions(converterList);
    }
}

Надявам се да помогне.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $atan2

  2. MongoDB:Как да получите точност на N десетични знаци в заявка

  3. Когато защитавате формуляр за коментари и свързаната крайна точка на API, трябва ли входът да бъде дезинфекциран, валидиран и кодиран в браузър, сървър или и двете?

  4. Персонализираните имена на взаимоотношения релси/монгоид не работят

  5. Mongodb - заявка за днешните общи суми, общите суми за седмицата и общите суми за месеца в една заявка