sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoRepository dynamiska frågor

Nedan är lösningen jag har kommit fram till. Så bara för att sammanfatta, problemet som jag hade, var att jag inte kunde exekvera en fråga givet ett Query-objekt som input för att få ökad flexibilitet över filtreringskriterierna. Lösningen visade sig vara ganska enkel, jag var bara tvungen att noga läsa dokumentationen :).

  1. steg

Utökar MongoRepository och lägg till dina anpassade funktioner:

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

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

Skapa en implementering för detta gränssnitt:

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

Ställ in din implementering som standardimplementering av MongoRepository:

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

Skapa ett arkiv för ditt anpassade objekt:

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

Om du nu har flera objekt som du vill spara i en mongo-dokumentbutik räcker det att definiera ett gränssnitt som utökar ditt ResourceRepository (som ses i steg 4), och du kommer att ha tillgänglig Page<T> findAll(Query query, Pageable pageable) anpassad frågemetod. Jag har tyckt att den här lösningen är den mest eleganta av den lösning jag har provat.

Om du har några förslag på förbättringar, vänligen dela dem med communityn.

Hälsningar, Cristian



  1. Vilken enhet används för att visa Redis CPU-användning

  2. Problem med att använda och köra bryggtjänster startar [e-postskyddad]

  3. Ogiltig ns vid anslutning till mongodb-server

  4. Hämta relevansbeställt resultat från textfråga på MongoDB Collection med C#-drivrutinen