sql >> Database >  >> NoSQL >> MongoDB

MongoRepository dynamische zoekopdrachten

Bellow is de oplossing die ik heb bedacht. Dus om het kort samen te vatten, het probleem dat ik had, was dat ik geen query kon uitvoeren met een Query-object als invoer om meer flexibiliteit te hebben met betrekking tot de filtercriteria. De oplossing bleek vrij eenvoudig, ik moest alleen de documentatie aandachtig lezen :).

  1. stap

Breidt MongoRepository uit en voegt uw aangepaste functies toe:

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

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

Maak een implementatie voor deze interface:

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

Stel uw implementatie in als de standaard MongoRepository-implementatie:

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

Maak een opslagplaats voor uw aangepaste object:

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

Als u nu meerdere objecten heeft die u in een Mongo-documentopslag wilt opslaan, volstaat het om een ​​interface te definiëren die uw ResourceRepository uitbreidt (zoals te zien in stap 4), en je hebt de Page<T> findAll(Query query, Pageable pageable) beschikbaar aangepaste querymethode. Ik vond deze oplossing de meest elegante oplossing die ik heb geprobeerd.

Als je suggesties voor verbeteringen hebt, deel deze dan met de community.

Groetjes, Cristian



  1. Bewaar geneste hash in redis via een node.js-app

  2. Hoe kan ik zien wanneer mijn sleutel is opgeslagen in Redis Cache/db?

  3. Spring Data Mongo Repository::Gemeenschappelijke gedeelde methode voor alle Repo-problemen

  4. mangoest 'findById' retourneert null met geldige id