Spring 数据 mongodb 按列表聚合过滤
Spring data mongodb aggregation filter by list
我按照这个问题 中的示例在 spring 数据 mongodb 的聚合中创建过滤器。在示例中,过滤器搜索 valueOf 和 equalToValue 以创建 $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"));
感谢您的回答。
我可以使用 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' 中的一些 class 来获取 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(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"));
感谢您的回答。
我可以使用 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' 中的一些 class 来获取 cat 列表的每个值。