具有多个条件的聚合
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,......)
我想使用多个条件进行聚合。问题是我不知道如何通过多个标准。我是否像下面那样声明多个 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,......)