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

MongoRepository動的クエリ

    ベローは私が思いついた解決策です。要約すると、私が抱えていた問題は、入力としてQueryオブジェクトを指定してクエリを実行できず、フィルタリング基準の柔軟性が向上したことです。解決策は非常に単純であることが判明しました。ドキュメントを注意深く読む必要がありました:)

    1. ステップ

    MongoRepositoryを拡張し、カスタム関数を追加します:

    @NoRepositoryBean
    public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
    
        Page<T> findAll(Query query, Pageable pageable);
    }
    
    1. ステップ

    このインターフェースの実装を作成します:

    public class ResourceRepositoryImpl<T, I extends Serializable> extends SimpleMongoRepository<T, I> implements ResourceRepository<T, I> {
    
        private MongoOperations mongoOperations;
        private MongoEntityInformation entityInformation;
    
        public ResourceRepositoryImpl(final MongoEntityInformation entityInformation, final MongoOperations mongoOperations) {
            super(entityInformation, mongoOperations);
    
            this.entityInformation = entityInformation;
            this.mongoOperations = mongoOperations;
        }
    
        @Override
        public Page<T> findAll(final Query query, final Pageable pageable) {
            Assert.notNull(query, "Query must not be null!");
    
            return new PageImpl<T>(
                    mongoOperations.find(query.with(pageable), entityInformation.getJavaType(), entityInformation.getCollectionName()),
                    pageable,
                    mongoOperations.count(query, entityInformation.getJavaType(), entityInformation.getCollectionName())
            );
        }
    }
    
    1. ステップ

    実装をデフォルトのMongoRepository実装として設定します:

    @EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
    public class MySpringApplication {
        public static void main(final String[] args) {
            SpringApplication.run(MySpringApplication.class, args);
        }
    }
    
    1. ステップ

    カスタムオブジェクトのリポジトリを作成します:

    public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
    }
    

    これで、mongoドキュメントストアに保存するオブジェクトが複数ある場合は、ResourceRepositoryを拡張するインターフェイスを定義するだけで十分です。 (手順4で見たように)、Page<T> findAll(Query query, Pageable pageable)が利用可能になります カスタムクエリメソッド。このソリューションは、私が試したソリューションの中で最もエレガントであることがわかりました。

    改善のための提案があれば、コミュニティと共有してください。

    よろしく、クリスチャン



    1. DateTimeをMongoDBに保存すると、パフォーマンスに影響します

    2. これは、mongodbにオブジェクトの配列を挿入および更新するための安全な方法ですか?

    3. insertManyは重複エラーを処理します

    4. ネストされたドキュメント値でMongoDB.findOne()関数を使用する