sql >> Databáze >  >> NoSQL >> MongoDB

Dynamické dotazy MongoRepository

Níže je řešení, na které jsem přišel. Takže jen pro rekapitulaci, problém, který jsem měl, byl ten, že nejsem schopen provést dotaz daný objektem Query jako vstupem, abych měl zvýšenou flexibilitu ohledně kritérií filtrování. Řešení se ukázalo jako celkem jednoduché, jen jsem si musel pečlivě přečíst dokumentaci :).

  1. krok

Rozšiřuje MongoRepository a přidává vaše vlastní funkce:

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

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

Vytvořte implementaci pro toto rozhraní:

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

Nastavte svou implementaci jako výchozí implementaci MongoRepository:

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

Vytvořte úložiště pro svůj vlastní objekt:

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

Nyní, pokud máte více objektů, které chcete uložit do úložiště dokumentů mongo, stačí definovat rozhraní, které rozšíří váš ResourceRepository (jak je vidět v kroku 4) a budete mít k dispozici Page<T> findAll(Query query, Pageable pageable) metoda vlastního dotazu. Zjistil jsem, že toto řešení je nejelegantnější z řešení, které jsem vyzkoušel.

Pokud máte nějaké návrhy na vylepšení, sdílejte je s komunitou.

S pozdravem, Cristian



  1. Mohu použít Tornado+ Celery+ RabbitMQ + Redis?

  2. Vložte nebo aktualizujte do Mongo pomocí mongoose a upravte vnitřní prvky během aktualizace

  3. Analyzujte migraci na heroku/aws týkající se obrázku

  4. Mongoose - Uložit pole řetězců