lib/mongo/collection/view/readable.rb in mongo-2.8.0 vs lib/mongo/collection/view/readable.rb in mongo-2.9.0.rc0

- old
+ new

@@ -136,27 +136,26 @@ def count(opts = {}) cmd = { :count => collection.name, :query => filter } cmd[:skip] = opts[:skip] if opts[:skip] cmd[:hint] = opts[:hint] if opts[:hint] cmd[:limit] = opts[:limit] if opts[:limit] + cmd[:readConcern] = read_concern if read_concern cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] - cmd[:readConcern] = collection.read_concern if collection.read_concern Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| - read_with_retry(session) do - server = selector.select_server(cluster) + read_with_retry(session, selector) do |server| apply_collation!(cmd, server, opts) - Operation::Count.new({ + Operation::Count.new( :selector => cmd, :db_name => database.name, :options => {:limit => -1}, :read => read_pref, :session => session - }).execute(server) - end.n.to_i + ).execute(server) + end.n.to_i end end # Get a count of matching documents in the collection. # @@ -179,11 +178,11 @@ # @since 2.6.0 def count_documents(opts = {}) pipeline = [:'$match' => filter] pipeline << { :'$skip' => opts[:skip] } if opts[:skip] pipeline << { :'$limit' => opts[:limit] } if opts[:limit] - pipeline << { :'$group' => { _id: nil, n: { :'$sum' => 1 } } } + pipeline << { :'$group' => { _id: 1, n: { :'$sum' => 1 } } } opts.select! { |k, _| [:hint, :max_time_ms, :read, :collation, :session].include?(k) } first = aggregate(pipeline, opts).first return 0 unless first first['n'].to_i @@ -204,17 +203,16 @@ # # @since 2.6.0 def estimated_document_count(opts = {}) cmd = { count: collection.name } cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] - cmd[:readConcern] = collection.read_concern if collection.read_concern + cmd[:readConcern] = read_concern if read_concern Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| - read_with_retry(session) do - server = selector.select_server(cluster) + read_with_retry(session, selector) do |server| Operation::Count.new( selector: cmd, db_name: database.name, read: read_pref, session: session @@ -242,17 +240,16 @@ def distinct(field_name, opts = {}) cmd = { :distinct => collection.name, :key => field_name.to_s, :query => filter } cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] - cmd[:readConcern] = collection.read_concern if collection.read_concern + cmd[:readConcern] = read_concern if read_concern Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| - read_with_retry(session) do - server = selector.select_server(cluster) + read_with_retry(session, selector) do |server| apply_collation!(cmd, server, opts) Operation::Distinct.new({ :selector => cmd, :db_name => database.name, :options => {:limit => -1}, @@ -540,10 +537,18 @@ def collation(doc = nil) configure(:collation, doc) end + def read_concern + if options[:session] && options[:session].in_transaction? + options[:session].send(:txn_read_concern) || collection.client.read_concern + else + collection.read_concern + end + end + def read_preference rp = if options[:session] && options[:session].in_transaction? options[:session].txn_read_preference || collection.client.read_preference else @read_preference ||= (options[:read] || collection.read_preference) @@ -569,10 +574,10 @@ server = server_selector.select_server(cluster) cmd = Operation::ParallelScan.new({ :coll_name => collection.name, :db_name => database.name, :cursor_count => cursor_count, - :read_concern => collection.read_concern, + :read_concern => read_concern, :session => session, }.merge!(options)) cmd.execute(server).cursor_ids.map do |cursor_id| result = if server.features.find_command_enabled? Operation::GetMore.new({