18

我将 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 是最好的选择?

谢谢

4

2 回答 2

27

为了在布尔逻辑中实现这一点,我执行以下操作并转换为编程语言中可用的操作

: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);
于 2012-08-28T18:06:18.520 回答
0

除了阿基米德的回答:
如果您需要匹配文档的计数,请替换$where$expr.

@Query("{ $or : [ { $expr: { $eq: ['?0', 'null'] } } , { field : ?0 } ] }")
Page<Something> findAll(String query, Pageable pageable);
于 2021-07-30T14:49:28.197 回答