如何使用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查询子文档,并按子文档的某个字段排序?