MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dynamiczne zapytania MongoRepository

Poniżej jest rozwiązanie, które wymyśliłem. Podsumowując, problem, który miałem, polegał na tym, że nie mogłem wykonać zapytania z obiektem Query jako danymi wejściowymi, aby mieć większą elastyczność w zakresie kryteriów filtrowania. Rozwiązanie okazało się dość proste, po prostu musiałem dokładnie przeczytać dokumentację :).

  1. krok

Rozszerza MongoRepository i dodaje własne funkcje:

@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {

    Page<T> findAll(Query query, Pageable pageable);
}
  1. krok

Utwórz implementację dla tego interfejsu:

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. krok

Ustaw swoją implementację jako domyślną implementację MongoRepository:

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

Utwórz repozytorium dla swojego niestandardowego obiektu:

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

Teraz, jeśli masz wiele obiektów, które chcesz zapisać w magazynie dokumentów mongo, wystarczy zdefiniować interfejs, który rozszerza twoje ResourceRepository (jak widać w kroku 4), a będziesz mieć dostęp do Page<T> findAll(Query query, Pageable pageable) niestandardowa metoda zapytania. Uważam, że to rozwiązanie jest najbardziej eleganckim rozwiązaniem, które wypróbowałem.

Jeśli masz jakieś sugestie dotyczące ulepszeń, podziel się nimi ze społecznością.

Pozdrawiam, Christianie



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zaimportować plik Geojson do MongoDB

  2. Znajdź i policz elementy kolekcji z Mongoose

  3. Jak sortować dokumenty podrzędne w polu tablicy?

  4. Błąd:brak obsługi gniazd unix w systemie Windows łączącym mongodb

  5. Uzyskiwanie listy unikalnych obiektów osadzonych/zagnieżdżonych w dokumencie MongoDB