首页 > 解决方案 > 如何获取列表包含所有查询元素的文档

问题描述

我遇到的问题如下:我有结构

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 的限制,您不能添加第二个‘成分’标准。查询已包含”充其量

先感谢您。

标签: mongodbcriteriaspring-data-mongodb

解决方案


我发现我必须.all()在此示例中使用 as 以确保所有成分都在查询列表中,但正如评论中提到的那样,这并不能解决不区分大小写的问题:

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);
        }

推荐阅读