如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?相关的知识,希望对你有一定的参考价值。

参考技术A Query query=new Query();
query.with(new Sort(new Sort.Order(Sort.Direction.ASC,"barOrder")));
rmongoTemplate.find(query, XX.class);

如何使用 Spring MongoTemplate 查询不区分大小写和包含

【中文标题】如何使用 Spring MongoTemplate 查询不区分大小写和包含【英文标题】:how to query case insensitivity and contains with Spring MongoTemplate 【发布时间】:2020-10-14 05:57:11 【问题描述】:

我在 MongoDB 中有这样的 JSON 文档


  "os" : "Windows 10"



  "os" : "WINDOWS 8"



  "os" : "UBunTu 18.04"

如何在不区分大小写的情况下查询 os 并包含使用 Spring MongoTemplate 以便我可以传递 ["windows", "ubuntu"] 并从数据库中获取所有三个文档

我尝试了类似的方法,但没有成功。

String osRegEx = String.join(" | ", new String[]"windows", "ubuntu");
query.addCriteria(Criteria.where("os").regex(osRegEx, "i"));

【问题讨论】:

【参考方案1】:

它以这种方式工作......

String osRegEx = String.join("|", new String[]"windows.*", "ubuntu.*");
query.addCriteria(Criteria.where("os").regex("("+osRegEx+")", "i"));

【讨论】:

【参考方案2】:

我认为您正面临这个问题,因为您为正则表达式提供了字符串。您在 mongo 中有 Windows 10 等版本号,但您只有正则表达式字符串来匹配 windows/ubuntu 部分:

String osRegEx = String.join(" | ", new String[]"windows.*", "ubuntu.*");
query.addCriteria(Criteria.where("os").regex(osRegEx, "i"));

【讨论】:

它正在与一个 "os" : "$regularExpression" : "pattern" : "Ubuntu.*", "options" : "i" 一起工作,但是当我同时通过 "os" : "$regularExpression" : "pattern" : "CentOS.* | Ubuntu.*", "options" : "i" 时它没有返回任何结果 抛出InvalidMongoDbApiUsageException。它不允许在$or 中有多个'os' 是的,对不起,它不起作用,我认为正则表达式应该有一个分组,如:(windows.*|ubuntu.*) 哇.. 当我使用(windows.*|ubuntu.*)时它起作用了 String osRegEx = String.join("|", new String[]"windows.*", "ubuntu.*"); query.addCriteria(Criteria.where("os").regex("("+osRegEx+")", "i"));【参考方案3】:

这里有一个解决方案:

String [] queryStrs =  "windows", "ubuntu" ;
String patternStr = Stream.of(queryStrs).collect(Collectors.joining("|", "(", ")"));
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);

Criteria criteria = new Criteria().regex(pattern);
Query query = Query.query(criteria);
List<Foo> result = mongoTemplate.find(query, Foo.class);

【讨论】:

我不明白为什么有人对答案投反对票。该代码工作正常 - 它返回所需的结果。可以要求解释帖子中使用的 API/代码。

以上是关于如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?的主要内容,如果未能解决你的问题,请参考以下文章

利用MongoTemplate 简单实现MongoDB 增删改查

如何在spring boot的多个类中使用@Autowired MongoTemplate

spring mongoTemplate简单使用

如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?

带有 MongoTemplate 的 Spring Boot

使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序