From f0946acd75ec048f5ed94ba2b822b4943ef717fc Mon Sep 17 00:00:00 2001 From: Bartek Marcinowski Date: Wed, 24 Jun 2015 15:51:24 +0100 Subject: [PATCH] Enable query plan explanation for the aggregation framework Add the explain-aggregate function, which returns a map containing information about the given aggregation query. --- src/clojure/monger/collection.clj | 9 +++++++++ test/monger/test/aggregation_framework_test.clj | 12 +++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/clojure/monger/collection.clj b/src/clojure/monger/collection.clj index 511ed59..1845c3f 100644 --- a/src/clojure/monger/collection.clj +++ b/src/clojure/monger/collection.clj @@ -515,7 +515,16 @@ res (.aggregate coll pipe agg-opts)] (map #(from-db-object % true) (iterator-seq res)))) +(defn explain-aggregate + "Returns the explain plan for an aggregation query. MongoDB 2.2+ only. + See http://docs.mongodb.org/manual/applications/aggregation/ to learn more." + [^DB db ^String coll stages & opts] + (let [coll (.getCollection db coll) + agg-opts (build-aggregation-options opts) + pipe (java.util.ArrayList. (to-db-object stages)) + res (.explainAggregate coll pipe agg-opts)] + (from-db-object res true))) ;; ;; Misc ;; diff --git a/test/monger/test/aggregation_framework_test.clj b/test/monger/test/aggregation_framework_test.clj index 481db8d..b243168 100644 --- a/test/monger/test/aggregation_framework_test.clj +++ b/test/monger/test/aggregation_framework_test.clj @@ -104,4 +104,14 @@ (is (= 6 (mc/count db coll))) (let [result (set (map #(select-keys % [:state :quantity]) (mc/aggregate db coll [{$project {:state 1 :quantity 1}}] :cursor {:batch-size 10})))] - (is (= expected result)))))) + (is (= expected result))))) + + (deftest test-explain-aggregate + (let [batch [{:state "CA" :price 100} + {:state "CA" :price 10} + {:state "IL" :price 50}] + expected-keys #{:ok :stages}] + (mc/insert-batch db coll batch) + (let [result (mc/explain-aggregate db coll [{$match {:state "CA"}}]) + key-in-result? (partial contains? result)] + (is (every? key-in-result? expected-keys))))))