Mongodb 如何使用Spring MongoTemplate查询大小写不敏感和包含

Mongodb 如何使用Spring MongoTemplate查询大小写不敏感和包含,mongodb,spring-boot,spring-data-mongodb,mongotemplate,spring-mongo,Mongodb,Spring Boot,Spring Data Mongodb,Mongotemplate,Spring Mongo,我在MongoDB中有这样的JSON文档 { "os" : "Windows 10" } { "os" : "WINDOWS 8" } { "os" : "UBunTu 18.04" } 如何使用Spring MongoTemplate查询不区分大小写的os,并包含内容,以便通过[“windows”,“ubuntu”]并从DB获取所有三个文档 我试过这样的方法

我在MongoDB中有这样的JSON文档

{
  "os" : "Windows 10"
}

{
  "os" : "WINDOWS 8"
}

{
  "os" : "UBunTu 18.04"
}
如何使用Spring MongoTemplate查询不区分大小写的
os
,并包含内容,以便通过
[“windows”,“ubuntu”]
并从DB获取所有三个文档

我试过这样的方法,但没有成功

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

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

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

它是这样工作的

String osRegEx = String.join("|", new String[]{"windows.*", "ubuntu.*"});
query.addCriteria(Criteria.where("os").regex("("+osRegEx+")", "i"));
以下是一个解决方案:

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);
String[]queryStrs={“windows”,“ubuntu”};
String patternStr=Stream.of(queryStrs.collect(collector.joining(“|”)、“(“,”));
Pattern=Pattern.compile(patternStr,Pattern.Pattern不区分大小写);
标准=新标准().regex(模式);
Query=Query.Query(条件);
List result=mongoTemplate.find(查询,Foo.class);

它正在使用一个
“os”:{“$regularExpression”:{“pattern”:“Ubuntu.*”,“options”:“i”}}}
但是当我同时通过这两个
“os”:{“$regularExpression”:{“pattern”:“CentOS.*.| Ubuntu.*”,“options”:“i”}
它不会返回任何结果。它不允许在
$或
中使用多个
'os'
,是的,很抱歉,它不起作用,我认为正则表达式应该有一个类似于:
(windows.*ubuntu.*)
哇。。当我使用
(windows.*|ubuntu.*)
String osRegEx=String.join(“|”),newstring[]{“windows.*”,“ubuntu.*});query.addCriteria(Criteria.where(“os”).regex(“(“+osRegEx+”)”,“i”)