diff --git a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Aggregation.java b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Aggregation.java index 206341f1..82658a72 100644 --- a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Aggregation.java +++ b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Aggregation.java @@ -189,6 +189,15 @@ public static Aggregation fromPipeline(List pipeline, DatabaseResolver } private List runStages() { + // Only apply index optimization if there are no variables to inject + // Variables need to be added to documents before $match can evaluate them + if (!hasVariables()) { + return stages.stream() + .filter(stage -> stage instanceof MatchStage) + .findFirst() + .map(match -> runStages(collection.handleQueryAsStream(((MatchStage) match).getQuery()))) + .orElseGet(() -> runStages(collection.queryAllAsStream())); + } return runStages(collection.queryAllAsStream()); } diff --git a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/MatchStage.java b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/MatchStage.java index 66efe63e..b11d4321 100644 --- a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/MatchStage.java +++ b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/MatchStage.java @@ -24,4 +24,8 @@ public String name() { public Stream apply(Stream stream) { return stream.filter(document -> queryMatcher.matches(document, query)); } + + public Document getQuery() { + return query; + } }