java - Spring Data 的 MongoTemplate 和 MongoReposito

我需要编写一个应用程序,我可以使用 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?两者都一样成熟还是其中一个比另一个缺少更多功能?

最佳答案

“方便”和“使用强大”在某种程度上是相互矛盾的目标。存储库比模板方便得多,但后者当然可以让您更精细地控制要执行的内容。

由于存储库编程模型可用于多个 Spring Data 模块,您可以在 Spring Data MongoDB reference docs 的常规部分找到更深入的文档。 .

TL;DR

我们一般推荐以下方法:

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

详情

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

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

    interface CustomUserRepository {
    
      List<User> yourCustomMethod();
    }
    
  2. 为这个类添加一个实现并遵循命名约定以确保我们可以找到这个类。

    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)扩展自定义接口(interface),基础架构将自动使用您的自定义实现:

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

通过这种方式,您基本上得到了选择:所有易于声明的内容都进入 UserRepository,所有更好地手动实现的内容都进入 CustomUserRepository。自定义选项记录在 here .

关于java - Spring Data 的 MongoTemplate 和 MongoRepository 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008947/

相关文章:

javascript - Mongoose:获取完整的用户列表

node.js - 编译 Mongoose 后无法覆盖模型

python - 插入后如何更新 Mongo 文档?

sql - mongo中的外键?

mongodb - 溢出排序阶段缓冲数据使用量超过内部限制

mongodb - 使用 Mongoose 从 MongoDB 文档中删除一个键

mongodb - 如何将 mongodb 客户端连接到本地 Meteor MongoDB

database-design - MongoDB Schema Design - 许多小文档还是更

macos - mac上mongodb数据库的位置

mongodb - 如何使用 MongoDB 过滤子文档中的数组