首页 > 解决方案 > Spring data mongodb聚合过滤器列表

问题描述

我按照这个问题中的示例在spring中创建过滤器聚合以在 spring 数据 mongodb 上的聚合中创建过滤器。在示例中,过滤器按valueOfequalToValue搜索以创建 $eq。如何创建一个 $in 并传递一个列表?

这是我的代码:

ProjectionOperation p2 = project()
            .andExpression("name").as("name")
            .andExpression("version._id").as("version._id")
            .andExpression("version.version").as("version.version")
            .and(filter("version.cat")
                    .as("cat")
                    .by(valueOf("cat._id")
                            .equalToValue(new ObjectId("5de99f42f15273c92d1228e8"))))
            .as("version.cat");

我正在寻找这样的东西:

**ProjectionOperation p2 = project()
            .andExpression("name").as("name")
            .andExpression("version._id").as("version._id")
            .andExpression("version.version").as("version.version")
            .and(filter("version.cat")
                    .as("cat")
                    .by(new Criteria("cat")
                            .in(Arrays.asList(
                                    new ObjectId("5de99f42f15273c92d1228f7"),
                                    new ObjectId("5de99f42f15273c92d1228f9"))
                            )
                            .getCriteriaObject()
                    )).as("version.cat"));

谢谢您的回答。

标签: arraysspringmongodbfilteraggregation

解决方案


我可以用ArrayOperators解决这个问题:

ProjectionOperation p2 = project()
            .andExpression("name").as("name")
            .andExpression("version._id").as("version._id")
            .andExpression("version.version").as("version.version")
            .and(filter("version.cat")
                    .as("cat")
                    .by(
                            ArrayOperators.In
                                    .arrayOf(Arrays.asList(
                                            new ObjectId("5de99f42f15273c92d1251853"),
                                            new ObjectId("5de99f42f15273c92d1251854"),
                                    )
                                    ).containsValue("$$cat._id")))
            .as("version.cat");

在 arrayOf 中,我传递了要与每个 objectId 的值进行比较的列表。我认为,过滤器会生成某种“for”类来获取 cat 列表的每个值。


推荐阅读