diff --git a/src/monger/query.clj b/src/monger/query.clj index cdc9153..916b7de 100644 --- a/src/monger/query.clj +++ b/src/monger/query.clj @@ -2,7 +2,7 @@ (:refer-clojure :exclude [select find sort]) (:require [monger.core] [monger.internal pagination]) - (:import [com.mongodb DB DBCollection DBObject DBCursor] + (:import [com.mongodb DB DBCollection DBObject DBCursor ReadPreference] [java.util List]) (:use [monger conversion operators])) @@ -52,16 +52,17 @@ (to-db-object (zipmap fields (repeat 1)))) (defn exec - [{ :keys [collection query fields skip limit sort batch-size hint snapshot] :or { limit 0 batch-size 256 skip 0 } }] + [{ :keys [collection query fields skip limit sort batch-size hint snapshot read-preference] :or { limit 0 batch-size 256 skip 0 } }] (let [cursor (doto ^DBCursor (.find ^DBCollection collection (to-db-object query) (fields-to-db-object fields)) (.limit limit) (.skip skip) (.sort (to-db-object sort)) (.batchSize batch-size) - (.hint ^DBObject (to-db-object hint)) - )] - (if snapshot + (.hint ^DBObject (to-db-object hint)))] + (when snapshot (.snapshot cursor)) + (when read-preference + (.setReadPreference cursor read-preference)) (map (fn [x] (from-db-object x true)) (seq cursor)))) @@ -101,6 +102,10 @@ [m] (merge m { :snapshot true })) +(defn read-preference + [m ^ReadPreference rp] + (merge m { :read-preference rp })) + (defn paginate [m & { :keys [page per-page] :or { page 1 per-page 10 } }] (merge m { :limit per-page :skip (monger.internal.pagination/offset-for page per-page) })) diff --git a/test/monger/test/querying.clj b/test/monger/test/querying.clj index d90b21b..1e12522 100644 --- a/test/monger/test/querying.clj +++ b/test/monger/test/querying.clj @@ -2,7 +2,7 @@ (ns monger.test.querying (:refer-clojure :exclude [select find sort]) - (:import [com.mongodb WriteResult WriteConcern DBCursor DBObject CommandResult$CommandFailure] + (:import [com.mongodb WriteResult WriteConcern DBCursor DBObject CommandResult$CommandFailure ReadPreference] [org.bson.types ObjectId] [java.util Date]) (:require [monger core util] @@ -189,7 +189,8 @@ result1 (with-collection coll (find {}) (paginate :page 1 :per-page 3) - (sort { :title 1 })) + (sort { :title 1 }) + (read-preference ReadPreference/PRIMARY)) result2 (with-collection coll (find {}) (paginate :page 2 :per-page 3)