一尘不染

spring-data-mongo-可选查询参数?

spring

我正在将spring-data mongo与基于JSON的查询方法一起使用,并且不确定如何在搜索查询中允许使用可选参数。

例如-说我有以下功能

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

但我不想应用名称正则表达式匹配,或者如果将NULL值传递给方法,则不希望应用日期范围限制。

目前看来,我可能必须使用mongoTemplate构建查询。

有没有其他选择-还是使用mongoTemplate是最佳选择?

谢谢


阅读 361

收藏
2020-04-20

共1个答案

一尘不染

为了以布尔逻辑实现此操作,我执行以下操作并将其转换为编程语言中可用的操作

:query != null -> field == :query
!(:query != null) || (field == :query)
(:query == null) || (field == :query)

| |
在普通的SQL中,这是通过

where (null = :query) or (field = :query)

在MongoDB中,这是通过$ where完成的

{ $where: '?0 == null || this.field == ?0' } 

通过使用Mongo Operations,我们可以稍微加快速度,而不是以牺牲一些可读性为代价来构建该函数的所有内容。不幸的是无法正常工作。

{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 

所以你拥有的是

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);

可以进一步扩展以处理in / all子句的数组

@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
List<Something> findAll(String query, Pageable pageable);
2020-04-20