Как получить документы, список которых содержит все запрашиваемые элементы - PullRequest
0 голосов
/ 26 марта 2019

У меня проблема в следующем: у меня есть структура

public class Recipe {

    @Id
    private UUID id;
    private String name;
    private Set<String> ingredients;

, и я пытаюсь создать критерий запроса, которому я передаю список строк и проверяю, содержит ли ингредиенты всеэлементы запроса (желательно без учета регистра).

То, что я пробовал:

if (!recipeQuery.getIngredients().isEmpty()) {
            recipeQuery.getIngredients().stream()
                    .map(i -> Criteria.where("ingredients").regex(recipeQuery.getName(), "i"))
                    .forEach(query::addCriteria);
        }

Любые попытки поиска нечувствительного к регистру набора в другой коллекции были встречены как "Из-за ограничений"com.mongodb.BasicDocument, вы не можете добавить второй критерий «ингредиенты». Запрос уже содержит «в лучшем случае

Заранее спасибо.

1 Ответ

0 голосов
/ 27 марта 2019

Я понял, что должен был использовать .all(), как в этом примере, чтобы убедиться, что все ингредиенты были в запрашиваемом списке, но, как упоминалось в комментариях, это не решает проблему без учета регистра:

if (!recipeQuery.getIngredients().isEmpty()) {
            Criteria categories = Criteria.where("ingredients").all(recipeQuery.getIngredients());
            query.addCriteria(categories);
        }

это также решает проблему с кейсом

if (!recipeQuery.getIngredients().isEmpty()) {
            Criteria categories = new Criteria();
            categories.andOperator(recipeQuery.getIngredients().stream()
                    .map(i -> Criteria.where("ingredients").regex(".*" + i + ".*", "i"))
                    .toArray(Criteria[]::new));
            query.addCriteria(categories);
        }
...