sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoRepository dynamiske forespørgsler

Nedenfor er den løsning, jeg har fundet på. Så bare for at opsummere, var det problem, jeg havde, at jeg ikke ville være i stand til at udføre en forespørgsel givet et Query-objekt som input for at få øget fleksibilitet i forhold til filtreringskriterierne. Løsningen viste sig at være ret simpel, jeg skulle bare læse dokumentationen omhyggeligt :).

  1. trin

Udvider MongoRepository og tilføjer dine brugerdefinerede funktioner:

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

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

Opret en implementering til denne grænseflade:

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

Indstil din implementering som standard MongoRepository implementering:

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

Opret et lager til dit brugerdefinerede objekt:

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

Hvis du nu har flere objekter, som du vil gemme i en mongo dokumentbutik, er det nok at definere en grænseflade, som udvider dit ResourceRepository (som vist i trin 4), og du vil have Page<T> findAll(Query query, Pageable pageable) tilpasset forespørgselsmetode. Jeg har fundet denne løsning som den mest elegante af den løsning, jeg har prøvet.

Hvis du har forslag til forbedringer, bedes du dele dem med fællesskabet.

Med venlig hilsen Cristian



  1. Hvordan bruger jeg sql som i PyMongo?

  2. REACT anmodning om hentning af indlæg

  3. Problemer med at bruge MongoDB som backend til Django-projektet (Django 1.7)

  4. tilslutning til Mongo DB med mongoose-version (4.11.0)