sql >> データベース >  >> NoSQL >> MongoDB

Spring Data Mongo-継承されたPOJOエンティティをマッピングする方法は?

    私自身の質問に答えます。コメントで述べたように、解決策はConverterを使用することです 。

    これが私のクラスモデルで達成しようとしたことの例です:

    Contact Personのいずれかになります またはOrganisation

    spring-data-mongodbを使用している場合 MongoRepository エンティティモデル、_classに従ってデータベースにデータを書き込むには フィールドは、ドキュメントのルートと複雑なプロパティタイプに追加されます(このセクションを参照 )。このフィールドには、Javaクラスの完全修飾名が格納され、MongoDbドキュメントからSpringデータモデルにマッピングするときに曖昧さを解消できます。

    アプリがデータベースからドキュメントを読み取るだけの場合(_classはありません) フィールド)、Contactをマッピングするときにインスタンス化するクラスをSpringデータに指示する必要があります 。 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. 複数の基準に一致するドキュメントを見つける方法

    2. 遅いMongoDBクエリ:理由を説明できますか?

    3. node.jsで同じ2つのアプリのredisデータベースを分離する方法

    4. エクスプレスポストリクエストでのUnhandledPromiseRejectionWarningの解決