当前位置: 首页 > 面试题库 >

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

万俟飞语
2023-03-14
问题内容

我正在将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是最佳选择?

谢谢


问题答案:

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

: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);


 类似资料:
  • 是否有其他选择-或者使用mongoTemplate是最好的选择? 谢谢

  • 我使用的是spring数据mongodb。 我想通过在查询中传递一些可选参数来查询数据库。 我有一个域类。 我的控制器: 这里Key和username是可选的查询参数。 如果我通过其中任何一个,它应该返回具有给定密钥或用户名的匹配文档。 我的服务方式是: 存储库: 但是通过使用上述查询,它不会返回具有给定密钥或用户名的文档。我的查询有什么问题? 这就是我提出请求的方式http://localhos

  • 问题内容: 我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如: 在这种情况下,此方法必须返回Foo: 如果gooParam不为null。如果gooParam为null,则条件更改为: 有什么解决办法吗?有人能帮我吗? 问题答案: 来不及了。不确定 Bar 和 Goo 之间的关系。检查 Example是否 可以帮助您。 它为我工作。我有一个类似的情况,实体 用户 具有属性集,并且有基于属

  • 大家好,我有一个大问题在查询我的数据。我有这样的文件: 我想构建两个查询: 1)每天计算标签的数量,然后输出,例如,如下所示: 2)另一个是相同的,但我想设置一个期间从2016-12-13到2016-12-17。 对于第一个查询,我编写了这个查询,并得到了我所搜索的内容,但是在Spring Data Mongo中,我不知道如何编写。

  • 我正在玩Spring数据Mongo查询,并想知道字段属性参数。以下是我从文档中获得的示例: 问题是:在{“firstname”:1,“lastname”:1}中,1的含义是什么?

  • 我想用spring Boot1.5执行过滤器列表的查询,我有必需的参数(用户名)和可选的参数(电子邮件),我如何在查询中分配可选的参数?@Query(“从User u中选择u.username LIKE:username和u.email=:email”)公共页面getUsers(@param(“username”)字符串username,@param(“email”)字符串email);http: