Подтвердить что ты не робот

Какая разница между Spring данными MongoTemplate и MongoRepository?

Мне нужно написать приложение, с помощью которого я могу выполнять сложные запросы с помощью spring -data и mongodb. Я начал использовать MongoRepository, но боролся со сложными запросами, чтобы найти примеры или понять Синтаксис.

Я говорю о таких запросах:

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    List<User> findByEmailOrLastName(String email, String lastName);
}

или использование запросов на основе JSON, которые я пробовал методом проб и ошибок, потому что я не получил синтаксис правильно. Даже после прочтения документации mongodb (нерабочий пример из-за неправильного синтаксиса).

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    @Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]")
    List<User> findByEmailOrFirstnameOrLastnameLike(String searchText);
} 

После прочтения всей документации кажется, что mongoTemplate гораздо лучше документирован, чем MongoRepository. Я имею в виду следующую документацию:

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/reference.html

Можете ли вы сказать мне, что более удобно и эффективно использовать? mongoTemplate или MongoRepository? Являются ли они одинаковыми зрелыми или у кого-то из них больше нет функций, чем на других?

4b9b3361

Ответ 1

"Удобные" и "мощные в использовании" в какой-то степени противоречат целям. Хранилища гораздо удобнее, чем шаблоны, но последние, конечно, дают вам более тонкий контроль над тем, что нужно выполнять.

Поскольку модель программирования репозитория доступна для нескольких модулей Spring Data, вы найдете более подробную документацию по ней в общем разделе Spring Data MongoDB reference docs.

TL; DR

Обычно мы рекомендуем следующий подход:

  • Начните с репозитория репозитория и просто объявите простые запросы с помощью механизма вывода запроса или вручную заданных запросов.
  • Для более сложных запросов добавьте в репозиторий вручную внедренные методы (как описано здесь). Для реализации используйте MongoTemplate.

Подробнее

В вашем примере это выглядит примерно так:

  • Определите интерфейс для вашего пользовательского кода:

    interface CustomUserRepository {
    
      List<User> yourCustomMethod();
    }
    
  • Добавьте реализацию для этого класса и следуйте правилам именования, чтобы убедиться, что мы можем найти класс.

    class UserRepositoryImpl implements CustomUserRepository {
    
      private final MongoOperations operations;
    
      @Autowired
      public UserRepositoryImpl(MongoOperations operations) {
    
        Assert.notNull(operations, "MongoOperations must not be null!");
        this.operations = operations;
      }
    
      public List<User> yourCustomMethod() {
        // custom implementation here
      }
    }
    
  • Теперь позвольте вашему базовому интерфейсу репозитория расширить пользовательский интерфейс, и инфраструктура автоматически использует вашу собственную реализацию:

    interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {
    
    }
    

Таким образом, вы по существу получаете выбор: все, что просто объявить, переходит в UserRepository, все, что лучше реализовано вручную, переходит в CustomUserRepository. Параметры настройки описаны здесь.

Ответ 2

Этот ответ может быть немного задержан, но я бы рекомендовал избежать всего маршрута репозитория. Вы получаете очень мало реализованных методов любой большой практической ценности. Чтобы заставить его работать, вы сталкиваетесь с ошибкой конфигурации Java, которую вы можете потратить дни и недели без значительной помощи в документации.

Вместо этого перейдите по маршруту MongoTemplate и создайте свой собственный уровень доступа к данным, который освободит вас от кошмаров конфигурации, с которыми сталкиваются программисты Spring. MongoTemplate - действительно спаситель для инженеров, которые умеют создавать свои собственные классы и взаимодействия, поскольку существует много гибкости. Структура может быть примерно такой:

  • Создайте класс MongoClientFactory, который будет работать на уровне приложения и даст вам объект MongoClient. Вы можете реализовать это как Singleton или использовать Enum Singleton (это потокобезопасно).
  • Создайте базовый класс доступа к данным, из которого вы можете наследовать объект доступа к данным для каждого объекта домена). Базовый класс может реализовать метод создания объекта MongoTemplate, который вы используете для определенных методов класса для всех обращений к БД
  • Каждый класс доступа к данным для каждого объекта домена может реализовать базовые методы или реализовать их в базовом классе
  • Затем методы Controller могут вызывать методы в классах доступа к данным.