具有多个条件的聚合

Aggregation with multiple criteria

我想使用多个条件进行聚合。问题是我不知道如何通过多个标准。我是否像下面那样声明多个 Match 操作?

MatchOperation matchOperation1 = Aggregation.match(criteria);
MatchOperation matchOperation2 = Aggregation.match(criteria2);

如果是,那么如何将它们传递给聚合方法?我认为应该可以创建一个符合多个条件的 MatchOperation,但我没有在网上找到这样的例子。

Do I declare multiple Match operation like below?

MatchOperation matchOperation1 = Aggregation.match(criteria); 
MatchOperation matchOperation2 = Aggregation.match(criteria2);

Criteria class 有一个 and 方法,它允许组合两个条件。例如,考虑三个文档:

{ _id: 1, size: 10, color: "blue" }
{ _id: 2, size: 12, color: "red" }
{ _id: 3, size: 8, color: "blue" }

聚合match阶段定义如下:

Aggregation.match(Criteria.where("size").gt(new Integer(8))
                            .and("color").is("blue")
)

这个returns和_id: 1的文档。

你可以试试这样的

final Criteria firstMatchCriteria = Criteria.where("fielname").is(someValue)
final Criteria secondMatchCriteria = Criteria.where("fielname").is(someValue)
final Aggregation aggregation = Aggregation.newAggregation(        match(firstMatchCriteria),unwind("FIELD_"),match(secondMatchCriteria),project())

毕竟这对我有用。

    Criteria criterias = new Criteria().andOperator(Criteria.where(Force.AMOUNT).gte(minForceAmount)
            .and(ForceType.TYPE).is(ForceTypeEnum.MAGNETIC_FORCE)
            .and("createdAt").gte(startDate).lte(endDate));
    MatchOperation matchOperation = Aggregation.match(criteria);

您还可以在 MatchOperation 中使用 criteria 的列表,当您想要动态过滤时:

List<Criteria> criterias = new ArrayList<>();
for (String key : mongoRequest.getFilterQuery().keySet()) {
                Criteria ci= new Criteria();
                List<Object> listOfValues=new ArrayList<>();
                for(Object value:mongoRequest.getFilterQuery().get(key)){
                    listOfValues.add(value);
                }
                ci = Criteria.where(key).in(listOfValues);
                criterias.add(ci);
           }
MatchOperation match =new MatchOperation(!criterias.isEmpty()?new Criteria().andOperator(criterias.toArray(new Criteria[criterias.size()])):new Criteria());

你也可以参考这个link .

我有更好的解决方案

Criteria result = criteria1.andOperator(criteria2, cri2teria,......)