一尘不染

Spring Data的MongoTemplate和MongoRepository有什么区别?

java

我需要编写一个应用程序,可以使用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/

你能告诉我使用什么更方便,更强大吗?mongoTemplate还是MongoRepository?两者都是成熟的,还是其中一个比另一个缺少更多的功能?


阅读 2877

收藏
2020-03-21

共1个答案

一尘不染

“方便”和“使用功能强大”在某种程度上与目标背道而驰。到目前为止,存储库比模板方便得多,但是后者当然可以为你提供对执行内容的更细粒度的控制。

由于存储库编程模型可用于多个Spring Data模块,因此你可以在Spring Data MongoDB 参考文档的常规部分中找到有关它的更多详细文档。

TL; DR

我们通常建议采用以下方法:

从存储库摘要开始,仅使用查询派生机制或手动定义的查询声明简单查询。
对于更复杂的查询,将手动实现的方法添加到存储库中(如此处所述)。供实现使用MongoTemplate。
细节

对于你的示例,这看起来像这样:

  1. 为你的自定义代码定义一个接口:
interface CustomUserRepository {

  List<User> yourCustomMethod();
}
  1. 为该类添加一个实现,并遵循命名约定以确保我们可以找到该类。
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
  }
}
  1. 现在,让你的基本存储库界面扩展自定义界面,基础结构将自动使用你的自定义实现:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {

}
2020-03-21