0

在 Monger 中使用 find-maps 时如何设置 ReadPreference?Monger 文档仅指定了 monger.query 的 with-collection 的用法,如下所示

(ns my.service.server
(:refer-clojure :exclude [sort find])
(:require [monger.core :as mg]
        [monger.query :refer :all])
(:import com.mongodb.ReadPreference))

(let [conn (mg/connect)
  db   (mg/get-db conn "monger-test")
  coll "scores"]
;; reads from primary (master) to guarantee consistency
;; (at the cost of putting extra load on the primary)
(with-collection db coll
(find {:email "joe@example.com"})
(read-preference (ReadPreference/primary))))
4

1 回答 1

2

一种方法是在连接到 Mongo 时设置读取首选项:

(mg/connect
  (mg/server-address "127.0.0.1" 27017)
  (mg/mongo-options {:read-preference (com.mongodb.ReadPreference/secondaryPreferred)}))

如果您正在考虑在 Java API 中使用此方法:https ://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/DBCollection.html#setReadPreference-com.mongodb.ReadPreference-我没有找到通过 monger 使用它的方法。但是,您可以使用自己的函数来利用此 API:

(defn find-with-read-preference [db coll]
  (.find (doto
           (.getCollection db (name coll))
           (.setReadPreference (ReadPreference/secondaryPreferred)))))

(defn find-maps-with-read-preference
  ([^DB db ^String coll]
   (with-open [result (find-with-read-preference db coll)]
     (map (fn [x] (monger.conversion/from-db-object x true)) result))))
于 2017-06-28T13:42:44.053 回答