From a2bc59dcfa7452df95fb9b87f317f5db4f4fbecd Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 16:34:38 +0200 Subject: [PATCH 1/7] Test that every query operator is defined --- test/monger/test/query_operators_test.clj | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/monger/test/query_operators_test.clj b/test/monger/test/query_operators_test.clj index bb09997..5022e04 100644 --- a/test/monger/test/query_operators_test.clj +++ b/test/monger/test/query_operators_test.clj @@ -3,10 +3,28 @@ [monger.collection :as mc] [monger.js :as js] [clojure.test :refer :all] - [monger.operators :refer :all])) + [clojure.set :refer [difference]] + [monger.operators :refer :all]) + (:import [com.mongodb QueryOperators])) ;; (use-fixtures :each purge-people purge-docs purge-things purge-libraries) +(deftest every-query-operator-is-defined + (let [driver-query-operators (->> (.getDeclaredFields QueryOperators) (map #(.get % nil)) set) + monger-query-operators (->> (ns-publics 'monger.operators) (map (comp name first)) set) + ; $within is deprecated and replaced by $geoWithin since v2.4. + ; $uniqueDocs is deprecated since v2.6. + deprecated-query-operators #{"$within" "$uniqueDocs"} + ; Query modifier operators that are deprecated in the mongo shell since v3.2 + deprecated-meta-operators #{"$comment" "$explain" "$hint" "$maxScan" + "$maxTimeMS" "$max" "$min" "$orderby" + "$returnKey" "$showDiskLoc" "$snapshot" "$query"} + undefined-non-deprecated-operators (difference driver-query-operators + deprecated-query-operators + deprecated-meta-operators + monger-query-operators)] + (is (= #{} undefined-non-deprecated-operators)))) + (let [conn (mg/connect) db (mg/get-db conn "monger-test")] (defn purge-collections From 08ce1e41b394f3af8571f8b669173f3089ce73bf Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 16:54:46 +0200 Subject: [PATCH 2/7] Add missing geospatial operators --- src/clojure/monger/operators.clj | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/clojure/monger/operators.clj b/src/clojure/monger/operators.clj index 505b9dd..6a9abc1 100644 --- a/src/clojure/monger/operators.clj +++ b/src/clojure/monger/operators.clj @@ -275,9 +275,18 @@ (defoperator $ifNull) (defoperator $cond) +;; Geospatial (defoperator $geoWithin) (defoperator $geoIntersects) (defoperator $near) +(defoperator $nearSphere) +(defoperator $geometry) +(defoperator $maxDistance) +(defoperator $minDistance) +(defoperator $center) +(defoperator $centerSphere) +(defoperator $box) +(defoperator $polygon) (defoperator $slice) From 8fd4946959015d93c44ca817445a959818638a68 Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 17:21:15 +0200 Subject: [PATCH 3/7] Add $where operator --- src/clojure/monger/operators.clj | 7 +++++++ test/monger/test/query_operators_test.clj | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/clojure/monger/operators.clj b/src/clojure/monger/operators.clj index 6a9abc1..53e501b 100644 --- a/src/clojure/monger/operators.clj +++ b/src/clojure/monger/operators.clj @@ -96,6 +96,13 @@ (defoperator $regex) (defoperator $options) +;; Matches documents that satisfy a JavaScript expression. +;; +;; EXAMPLES: +;; +;; (monger.collection/find "people" { $where "this.placeOfBirth === this.address.city" }) +(defoperator $where) + ;; ;; LOGIC OPERATORS ;; diff --git a/test/monger/test/query_operators_test.clj b/test/monger/test/query_operators_test.clj index 5022e04..1cc6184 100644 --- a/test/monger/test/query_operators_test.clj +++ b/test/monger/test/query_operators_test.clj @@ -125,4 +125,10 @@ {:language {$regex "clo.*" $options "i"}} 2 {:name {$regex "aK.*" $options "i"}} 1 {:language {$regex ".*by"}} 1 - {:language {$regex ".*ala.*"}} 1)))) + {:language {$regex ".*ala.*"}} 1))) + + (deftest find-with-js-expression + (let [collection "people"] + (mc/insert-batch db collection [{:name "Bob" :placeOfBirth "New York" :address {:city "New York"}} + {:name "Alice" :placeOfBirth "New York" :address {:city "Los Angeles"}}]) + (is (= 1 (.count (mc/find db collection {$where "this.placeOfBirth === this.address.city"}))))))) From 3d4a38a10a98d98cf874d85887a1a7b75efb4eab Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 17:31:16 +0200 Subject: [PATCH 4/7] Fix test name to match what is tested --- test/monger/test/query_operators_test.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/monger/test/query_operators_test.clj b/test/monger/test/query_operators_test.clj index 1cc6184..234389b 100644 --- a/test/monger/test/query_operators_test.clj +++ b/test/monger/test/query_operators_test.clj @@ -58,7 +58,7 @@ ;; $ne ;; - (deftest find-with-and-or-operators + (deftest find-with-ne-operator (let [collection "libraries"] (mc/insert-batch db collection [{:language "Ruby" :name "mongoid" :users 1} {:language "Clojure" :name "langohr" :users 5} From 2021c6d07fceafd3ef1ba16350d7cacc24973152 Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 17:49:32 +0200 Subject: [PATCH 5/7] Fix $ne operator usage The flaw was exposed when the test name was fixed. --- src/clojure/monger/operators.clj | 2 +- test/monger/test/query_operators_test.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clojure/monger/operators.clj b/src/clojure/monger/operators.clj index 53e501b..b113148 100644 --- a/src/clojure/monger/operators.clj +++ b/src/clojure/monger/operators.clj @@ -83,7 +83,7 @@ ;; $ne is "non-equals" comparator ;; ;; EXAMPLES: -;; (monger.collection/find "libraries" {$ne { :language "Clojure" }}) +;; (monger.collection/find "libraries" { :language { $ne "Clojure" }}) (defoperator $ne) ;; $elemMatch checks if an element in an array matches the specified expression diff --git a/test/monger/test/query_operators_test.clj b/test/monger/test/query_operators_test.clj index 234389b..bada551 100644 --- a/test/monger/test/query_operators_test.clj +++ b/test/monger/test/query_operators_test.clj @@ -64,7 +64,7 @@ {:language "Clojure" :name "langohr" :users 5} {:language "Clojure" :name "incanter" :users 15} {:language "Scala" :name "akka" :users 150}]) - (is (= 2 (.count (mc/find db collection {$ne {:language "Clojure"}})))))) + (is (= 2 (.count (mc/find db collection {:language {$ne "Clojure"}})))))) ;; From 82c76dd66dfd2e5044fc713a8c948b106c6e2648 Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 17:50:07 +0200 Subject: [PATCH 6/7] Add $eq operator --- src/clojure/monger/operators.clj | 6 ++++++ test/monger/test/query_operators_test.clj | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/clojure/monger/operators.clj b/src/clojure/monger/operators.clj index b113148..c186529 100644 --- a/src/clojure/monger/operators.clj +++ b/src/clojure/monger/operators.clj @@ -80,6 +80,12 @@ ;; (mgcol/find-maps "languages" { :tags { $nin [ "functional" ] } } ) (defoperator $nin) +;; $eq is "equals" comparator +;; +;; EXAMPLES: +;; (monger.collection/find "libraries" { :language { $eq "Clojure" }}) +(defoperator $eq) + ;; $ne is "non-equals" comparator ;; ;; EXAMPLES: diff --git a/test/monger/test/query_operators_test.clj b/test/monger/test/query_operators_test.clj index bada551..80ec631 100644 --- a/test/monger/test/query_operators_test.clj +++ b/test/monger/test/query_operators_test.clj @@ -54,6 +54,18 @@ 2 {:users {$lte 5}} 1 {:users {$gt 10 $lt 150}}))) + ;; + ;; $eq + ;; + + (deftest find-with-eq-operator + (let [collection "libraries"] + (mc/insert-batch db collection [{:language "Ruby" :name "mongoid" :users 1 :displayName nil} + {:language "Clojure" :name "langohr" :users 5} + {:language "Clojure" :name "incanter" :users 15} + {:language "Scala" :name "akka" :users 150}]) + (is (= 2 (.count (mc/find db collection {:language {$eq "Clojure"}})))))) + ;; ;; $ne ;; From 0d7dc9357a9962d7f80d82239cd5e64e5f3a2b1d Mon Sep 17 00:00:00 2001 From: Juha Jokimaki Date: Sun, 30 Oct 2016 18:14:58 +0200 Subject: [PATCH 7/7] Add $isolated operator --- src/clojure/monger/operators.clj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/clojure/monger/operators.clj b/src/clojure/monger/operators.clj index c186529..a4311af 100644 --- a/src/clojure/monger/operators.clj +++ b/src/clojure/monger/operators.clj @@ -314,3 +314,9 @@ ;; EXAMPLES: ;; (mgcol/update coll { :_id oid } { $currentDate { :lastModified true } }) (defoperator $currentDate) + +;; Isolates intermediate multi-document updates from other clients. +;; +;; EXAMPLES: +;; (mgcol/update "libraries" { :language "Clojure", $isolated 1 } { $inc { :popularity 1 } } {:multi true}) +(defoperator $isolated)