Spring Data的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更好。 我指的是以下文件:

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

你能告诉我什么更方便和强大的使用? mongoTemplateMongoRepository ? 都是同样成熟还是其中一个比另一个缺乏更多的function?

“方便”和“强大使用”在一定程度上是矛盾的。 版本库比模板要方便得多,但是后者当然会给你更细致的控制权。

由于存储库编程模型可用于多个Spring Data模块,因此您可以在Spring Data MongoDB 参考文档的常规部分find更深入的文档 。

TL; DR

我们通常推荐以下方法:

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

细节

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

  1. 为您的自定义代码定义一个接口:

     interface CustomUserRepository { List<User> yourCustomMethod(); } 
  2. 为这个类添加一个实现,并按照命名约定来确保我们可以find这个类。

     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 } } 
  3. 现在让您的基础知识库接口扩展自定义的一个,基础架构将自动使用您的自定义实现:

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

这样你就可以做出select了:只需要简单的声明就可以进入UserRepository ,手动执行的所有内容都将进入CustomUserRepository 。 这里定制了自定义选项。

这个答案可能有点延迟,但我会build议避免整个存储库路线。 你得到很less的实施方法具有很大的实用价值。 为了使它工作,你会遇到Javaconfiguration废话,你可以花几天和几周的时间在文档中没有太多的帮助。

而是使用MongoTemplate路线,创build自己的数据访问层,从而免除Spring程序员面临的configuration恶梦。 MongoTemplate是真正的工程师的救世主,因为它有很大的灵活性,所以舒适地构build他们自己的类和交互。 结构可以是这样的:

  1. 创build一个将在应用程序级别运行的MongoClientFactory类,并为您提供一个MongoClient对象。 你可以实现这个作为一个单身人士或使用枚举单身人士(这是线程安全的)
  2. 创build一个数据访问基类,您可以从中inheritance每个域对象的数据访问对象)。 基类可以实现一个创buildMongoTemplate对象的方法,您可以使用特定类的方法来访问所有数据库
  3. 每个域对象的每个数据访问类都可以实现基本方法,或者可以在基类中实现它们
  4. Controller方法可以根据需要调用Data访问类中的方法。