как запросить нечувствительность к регистру и содержит с помощью Spring MongoTemplate

У меня есть документы JSON в MongoDB, подобные этим

{
  "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"));

person MAHIE    schedule 24.06.2020    source источник


Ответы (3)


Это работало таким образом...

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

Я думаю, вы столкнулись с этой проблемой из-за строки, которую вы предоставили для регулярного выражения. У вас есть Windows 10 и т. д. в монго с номером версии, но у вас есть только строка регулярного выражения, соответствующая части windows/ubuntu:

String osRegEx = String.join(" | ", new String[]{"windows.*", "ubuntu.*"});
query.addCriteria(Criteria.where("os").regex(osRegEx, "i"));
person Ananthapadmanabhan    schedule 24.06.2020
comment
он работает с одним "os" : { "$regularExpression" : { "pattern" : "Ubuntu.*", "options" : "i"}}}, но когда я передаю оба "os" : { "$regularExpression" : { "pattern" : "CentOS.* | Ubuntu.*", "options" : "i"}}}, он не возвращает никаких результатов - person MAHIE; 24.06.2020
comment
бросая InvalidMongoDbApiUsageException. это не позволяет несколько 'os' в $or - person MAHIE; 24.06.2020
comment
Да, извините, это не сработает, я думаю, что регулярное выражение должно иметь такую ​​​​группировку: (windows.*|ubuntu.*) - person Ananthapadmanabhan; 24.06.2020
comment
Вау.. это сработало, когда я использовал (windows.*|ubuntu.*) - person MAHIE; 24.06.2020
comment
@MAHIE, в конце концов, это была проблема с регулярным выражением! - person Ananthapadmanabhan; 24.06.2020

Вот решение:

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);
person prasad_    schedule 24.06.2020
comment
Я не понимаю, почему кто-то проголосовал против ответа. Код работает нормально - возвращает требуемый результат. Можно запросить объяснение API/кода, использованного в сообщении. - person prasad_; 25.06.2020