MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Динамични заявки на MongoRepository

По-долу е решението, което измислих. Така че само да обобщя, проблемът, който имах, беше, че не искам да изпълня заявка, дадена като входен обект Query, за да имам повишена гъвкавост спрямо критериите за филтриране. Решението се оказа доста просто, просто трябваше внимателно да прочета документацията :).

  1. стъпка

Разширява MongoRepository и добавя вашите персонализирани функции:

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

    Page<T> findAll(Query query, Pageable pageable);
}
  1. стъпка

Създайте имплементация за този интерфейс:

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. стъпка

Задайте внедряването си като изпълнение на MongoRepository по подразбиране:

@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
    public static void main(final String[] args) {
        SpringApplication.run(MySpringApplication.class, args);
    }
}
  1. стъпка

Създайте хранилище за вашия потребителски обект:

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

Сега, ако имате множество обекти, които искате да запазите в хранилище за документи mongo, достатъчно е да дефинирате интерфейс, който разширява вашето ResourceRepository (както се вижда в стъпка 4) и ще имате на разположение Page<T> findAll(Query query, Pageable pageable) персонализиран метод на заявка. Намерих това решение за най-елегантното от всички, които съм опитвал.

Ако имате някакви предложения за подобрения, моля, споделете ги с общността.

Поздрави, Кристиан



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Разлика между декорирането на свойство в C# с BsonRepresentation(BsonType.ObjectId) срещу BsonId срещу ObjectId

  2. Как да импортирам данни от mongodb в pandas?

  3. Как да съхранявате големи числа в MongoDB с Node.js

  4. Защо MongoDB – 10 причини да научите MongoDB за 2022 г

  5. Вложена заявка на Mongoose в модел по поле на неговия рефериран модел