mongo 2.4.3 → 2.5.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +3 -2
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +3 -2
- data/lib/mongo/auth/cr.rb +6 -4
- data/lib/mongo/auth/cr/conversation.rb +33 -17
- data/lib/mongo/auth/ldap.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +19 -9
- data/lib/mongo/auth/scram.rb +7 -4
- data/lib/mongo/auth/scram/conversation.rb +62 -24
- data/lib/mongo/auth/user.rb +10 -0
- data/lib/mongo/auth/user/view.rb +44 -22
- data/lib/mongo/auth/x509.rb +4 -2
- data/lib/mongo/auth/x509/conversation.rb +19 -9
- data/lib/mongo/bulk_write.rb +33 -27
- data/lib/mongo/bulk_write/combineable.rb +5 -0
- data/lib/mongo/bulk_write/transformable.rb +2 -0
- data/lib/mongo/bulk_write/validatable.rb +4 -0
- data/lib/mongo/client.rb +123 -12
- data/lib/mongo/cluster.rb +52 -11
- data/lib/mongo/cluster/app_metadata.rb +8 -2
- data/lib/mongo/cluster/cursor_reaper.rb +0 -1
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/collection.rb +114 -27
- data/lib/mongo/collection/view.rb +8 -2
- data/lib/mongo/collection/view/aggregation.rb +11 -7
- data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
- data/lib/mongo/collection/view/builder/find_command.rb +5 -3
- data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +160 -0
- data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
- data/lib/mongo/collection/view/iterable.rb +11 -10
- data/lib/mongo/collection/view/map_reduce.rb +22 -18
- data/lib/mongo/collection/view/readable.rb +51 -37
- data/lib/mongo/collection/view/writable.rb +72 -40
- data/lib/mongo/cursor.rb +25 -4
- data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
- data/lib/mongo/database.rb +22 -11
- data/lib/mongo/database/view.rb +16 -12
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_session.rb +36 -0
- data/lib/mongo/error/missing_resume_token.rb +39 -0
- data/lib/mongo/error/operation_failure.rb +17 -0
- data/lib/mongo/error/parser.rb +3 -2
- data/lib/mongo/error/unknown_payload_type.rb +41 -0
- data/lib/mongo/error/unsupported_array_filters.rb +51 -0
- data/lib/mongo/error/unsupported_message_type.rb +23 -0
- data/lib/mongo/grid/fs_bucket.rb +5 -4
- data/lib/mongo/grid/stream/read.rb +3 -2
- data/lib/mongo/grid/stream/write.rb +2 -2
- data/lib/mongo/index/view.rb +35 -25
- data/lib/mongo/monitoring/event/secure.rb +14 -0
- data/lib/mongo/operation.rb +16 -0
- data/lib/mongo/operation/commands.rb +1 -0
- data/lib/mongo/operation/commands/aggregate.rb +9 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
- data/lib/mongo/operation/commands/collections_info.rb +6 -6
- data/lib/mongo/operation/commands/command.rb +2 -1
- data/lib/mongo/operation/commands/create.rb +6 -2
- data/lib/mongo/operation/commands/drop.rb +6 -2
- data/lib/mongo/operation/commands/drop_database.rb +6 -2
- data/lib/mongo/operation/commands/explain.rb +27 -0
- data/lib/mongo/operation/commands/explain/result.rb +52 -0
- data/lib/mongo/operation/commands/indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_collections.rb +1 -1
- data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes.rb +1 -1
- data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
- data/lib/mongo/operation/commands/map_reduce.rb +8 -4
- data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
- data/lib/mongo/operation/commands/user_query.rb +1 -1
- data/lib/mongo/operation/commands/users_info.rb +6 -2
- data/lib/mongo/operation/executable.rb +4 -1
- data/lib/mongo/operation/read_preference.rb +10 -5
- data/lib/mongo/operation/result.rb +26 -2
- data/lib/mongo/operation/specifiable.rb +13 -1
- data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
- data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
- data/lib/mongo/operation/write/command/create_index.rb +6 -1
- data/lib/mongo/operation/write/command/delete.rb +28 -4
- data/lib/mongo/operation/write/command/drop_index.rb +6 -1
- data/lib/mongo/operation/write/command/insert.rb +22 -18
- data/lib/mongo/operation/write/command/update.rb +24 -9
- data/lib/mongo/operation/write/command/writable.rb +14 -1
- data/lib/mongo/operation/write/insert.rb +4 -1
- data/lib/mongo/operation/write/insert/result.rb +2 -2
- data/lib/mongo/operation/write/update.rb +7 -1
- data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
- data/lib/mongo/protocol.rb +3 -0
- data/lib/mongo/protocol/bit_vector.rb +2 -2
- data/lib/mongo/protocol/compressed.rb +135 -0
- data/lib/mongo/protocol/delete.rb +8 -6
- data/lib/mongo/protocol/get_more.rb +8 -6
- data/lib/mongo/protocol/insert.rb +8 -6
- data/lib/mongo/protocol/kill_cursors.rb +8 -6
- data/lib/mongo/protocol/message.rb +31 -3
- data/lib/mongo/protocol/msg.rb +172 -0
- data/lib/mongo/protocol/query.rb +26 -6
- data/lib/mongo/protocol/registry.rb +76 -0
- data/lib/mongo/protocol/reply.rb +10 -5
- data/lib/mongo/protocol/serializers.rb +224 -0
- data/lib/mongo/protocol/update.rb +8 -6
- data/lib/mongo/retryable.rb +4 -2
- data/lib/mongo/server.rb +6 -3
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +30 -8
- data/lib/mongo/server/description.rb +25 -1
- data/lib/mongo/server/description/features.rb +4 -1
- data/lib/mongo/server/monitor.rb +5 -0
- data/lib/mongo/server/monitor/connection.rb +50 -2
- data/lib/mongo/server_selector/nearest.rb +10 -4
- data/lib/mongo/server_selector/primary.rb +20 -0
- data/lib/mongo/server_selector/primary_preferred.rb +10 -4
- data/lib/mongo/server_selector/secondary.rb +10 -4
- data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
- data/lib/mongo/session.rb +180 -0
- data/lib/mongo/session/server_session.rb +73 -0
- data/lib/mongo/session/session_pool.rb +161 -0
- data/lib/mongo/uri.rb +11 -0
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +2 -1
- data/spec/mongo/auth/cr_spec.rb +12 -0
- data/spec/mongo/auth/ldap_spec.rb +2 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
- data/spec/mongo/auth/scram_spec.rb +25 -1
- data/spec/mongo/auth/user/view_spec.rb +268 -76
- data/spec/mongo/auth/x509_spec.rb +2 -0
- data/spec/mongo/bulk_write_spec.rb +435 -5
- data/spec/mongo/client_spec.rb +356 -39
- data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
- data/spec/mongo/cluster_spec.rb +176 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
- data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
- data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
- data/spec/mongo/collection/view/readable_spec.rb +3 -12
- data/spec/mongo/collection_spec.rb +1048 -42
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
- data/spec/mongo/cursor_spec.rb +2 -2
- data/spec/mongo/database_spec.rb +50 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
- data/spec/mongo/grid/stream/read_spec.rb +2 -2
- data/spec/mongo/index/view_spec.rb +146 -8
- data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
- data/spec/mongo/operation/read/query_spec.rb +2 -1
- data/spec/mongo/operation/specifiable_spec.rb +2 -2
- data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
- data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
- data/spec/mongo/operation/write/command/update_spec.rb +93 -10
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +1 -1
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +66 -0
- data/spec/mongo/protocol/delete_spec.rb +14 -0
- data/spec/mongo/protocol/get_more_spec.rb +14 -0
- data/spec/mongo/protocol/insert_spec.rb +14 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
- data/spec/mongo/protocol/msg_spec.rb +499 -0
- data/spec/mongo/protocol/query_spec.rb +45 -0
- data/spec/mongo/protocol/registry_spec.rb +31 -0
- data/spec/mongo/protocol/reply_spec.rb +14 -0
- data/spec/mongo/protocol/update_spec.rb +14 -0
- data/spec/mongo/retryable_spec.rb +6 -2
- data/spec/mongo/sdam_spec.rb +4 -0
- data/spec/mongo/server/connection_spec.rb +4 -2
- data/spec/mongo/server/description_spec.rb +28 -1
- data/spec/mongo/session/server_session_spec.rb +16 -0
- data/spec/mongo/session/session_pool_spec.rb +194 -0
- data/spec/mongo/uri_spec.rb +31 -2
- data/spec/spec_helper.rb +104 -0
- data/spec/support/authorization.rb +6 -1
- data/spec/support/crud.rb +3 -1
- data/spec/support/crud/write.rb +6 -1
- data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
- data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
- data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
- data/spec/support/sdam/rs/discover_passives.yml +2 -2
- data/spec/support/sdam/rs/discover_primary.yml +1 -1
- data/spec/support/sdam/rs/discover_secondary.yml +1 -1
- data/spec/support/sdam/rs/discovery.yml +4 -4
- data/spec/support/sdam/rs/equal_electionids.yml +1 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
- data/spec/support/sdam/rs/ls_timeout.yml +88 -0
- data/spec/support/sdam/rs/member_reconfig.yml +2 -2
- data/spec/support/sdam/rs/member_standalone.yml +2 -2
- data/spec/support/sdam/rs/new_primary.yml +2 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
- data/spec/support/sdam/rs/non_rs_member.yml +1 -1
- data/spec/support/sdam/rs/normalize_case.yml +1 -1
- data/spec/support/sdam/rs/null_election_id.yml +4 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
- data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
- data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
- data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/response_from_removed.yml +2 -2
- data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
- data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
- data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
- data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
- data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
- data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
- data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
- data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
- data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
- data/spec/support/sdam/single/not_ok_response.yml +1 -1
- data/spec/support/sdam/single/standalone_removed.yml +1 -1
- data/spec/support/sdam/single/unavailable_seed.yml +1 -1
- data/spec/support/server_discovery_and_monitoring.rb +4 -0
- data/spec/support/shared/session.rb +236 -0
- metadata +53 -15
- metadata.gz.sig +0 -0
data/lib/mongo/cluster.rb
CHANGED
@@ -48,6 +48,11 @@ module Mongo
|
|
48
48
|
# @since 2.4.0
|
49
49
|
IDLE_WRITE_PERIOD_SECONDS = 10
|
50
50
|
|
51
|
+
# The cluster time key in responses from mongos servers.
|
52
|
+
#
|
53
|
+
# @since 2.5.0
|
54
|
+
CLUSTER_TIME = 'clusterTime'.freeze
|
55
|
+
|
51
56
|
# @return [ Hash ] The options hash.
|
52
57
|
attr_reader :options
|
53
58
|
|
@@ -63,6 +68,11 @@ module Mongo
|
|
63
68
|
# @since 2.4.0
|
64
69
|
attr_reader :app_metadata
|
65
70
|
|
71
|
+
# @return [ BSON::Document ] The latest cluster time seen.
|
72
|
+
#
|
73
|
+
# @since 2.5.0
|
74
|
+
attr_reader :cluster_time
|
75
|
+
|
66
76
|
def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
|
67
77
|
:single?, :unknown?, :member_discovered
|
68
78
|
def_delegators :@cursor_reaper, :register_cursor, :schedule_kill_cursor, :unregister_cursor
|
@@ -155,9 +165,11 @@ module Mongo
|
|
155
165
|
@monitoring = monitoring
|
156
166
|
@event_listeners = Event::Listeners.new
|
157
167
|
@options = options.freeze
|
158
|
-
@app_metadata
|
168
|
+
@app_metadata = AppMetadata.new(self)
|
159
169
|
@update_lock = Mutex.new
|
160
170
|
@pool_lock = Mutex.new
|
171
|
+
@cluster_time = nil
|
172
|
+
@cluster_time_lock = Mutex.new
|
161
173
|
@topology = Topology.initial(seeds, monitoring, options)
|
162
174
|
|
163
175
|
publish_sdam_event(
|
@@ -442,6 +454,43 @@ module Mongo
|
|
442
454
|
addresses_list
|
443
455
|
end
|
444
456
|
|
457
|
+
# The logical session timeout value in minutes.
|
458
|
+
#
|
459
|
+
# @example Get the logical session timeout in minutes.
|
460
|
+
# cluster.logical_session_timeout
|
461
|
+
#
|
462
|
+
# @return [ Integer, nil ] The logical session timeout.
|
463
|
+
#
|
464
|
+
# @since 2.5.0
|
465
|
+
def logical_session_timeout
|
466
|
+
servers.inject(nil) do |min, server|
|
467
|
+
break unless timeout = server.logical_session_timeout
|
468
|
+
[timeout, (min || timeout)].min
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
# Update the max cluster time seen in a response.
|
473
|
+
#
|
474
|
+
# @example Update the cluster time.
|
475
|
+
# cluster.update_cluster_time(result)
|
476
|
+
#
|
477
|
+
# @param [ Operation::Result ] The operation result containing the cluster time.
|
478
|
+
#
|
479
|
+
# @return [ Object ] The cluster time.
|
480
|
+
#
|
481
|
+
# @since 2.5.0
|
482
|
+
def update_cluster_time(result)
|
483
|
+
if cluster_time_doc = result.cluster_time
|
484
|
+
@cluster_time_lock.synchronize do
|
485
|
+
if @cluster_time.nil?
|
486
|
+
@cluster_time = cluster_time_doc
|
487
|
+
else
|
488
|
+
@cluster_time = cluster_time_doc if cluster_time_doc[CLUSTER_TIME] > @cluster_time[CLUSTER_TIME]
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
445
494
|
private
|
446
495
|
|
447
496
|
def direct_connection?(address)
|
@@ -457,19 +506,11 @@ module Mongo
|
|
457
506
|
end
|
458
507
|
|
459
508
|
def servers_list
|
460
|
-
@update_lock.synchronize
|
461
|
-
@servers.reduce([]) do |servers, server|
|
462
|
-
servers << server
|
463
|
-
end
|
464
|
-
end
|
509
|
+
@update_lock.synchronize { @servers.dup }
|
465
510
|
end
|
466
511
|
|
467
512
|
def addresses_list
|
468
|
-
@update_lock.synchronize
|
469
|
-
@addresses.reduce([]) do |addresses, address|
|
470
|
-
addresses << address
|
471
|
-
end
|
472
|
-
end
|
513
|
+
@update_lock.synchronize { @addresses.dup }
|
473
514
|
end
|
474
515
|
end
|
475
516
|
end
|
@@ -54,6 +54,7 @@ module Mongo
|
|
54
54
|
def initialize(cluster)
|
55
55
|
@app_name = cluster.options[:app_name]
|
56
56
|
@platform = cluster.options[:platform]
|
57
|
+
@compressors = cluster.options[:compressors] || []
|
57
58
|
end
|
58
59
|
|
59
60
|
# Get the bytes of the ismaster message including this metadata.
|
@@ -89,6 +90,10 @@ module Mongo
|
|
89
90
|
end
|
90
91
|
|
91
92
|
def serialize
|
93
|
+
Protocol::Query.new(Database::ADMIN, Database::COMMAND, document, :limit => -1).serialize
|
94
|
+
end
|
95
|
+
|
96
|
+
def document
|
92
97
|
client_document = full_client_document
|
93
98
|
while client_document.to_bson.to_s.size > MAX_DOCUMENT_SIZE do
|
94
99
|
if client_document[:os][:name] || client_document[:os][:architecture]
|
@@ -101,8 +106,9 @@ module Mongo
|
|
101
106
|
end
|
102
107
|
end
|
103
108
|
document = Server::Monitor::Connection::ISMASTER
|
104
|
-
document = document.merge(
|
105
|
-
|
109
|
+
document = document.merge(compression: @compressors)
|
110
|
+
document[:client] = client_document
|
111
|
+
document
|
106
112
|
end
|
107
113
|
|
108
114
|
def driver_doc
|
@@ -51,7 +51,7 @@ module Mongo
|
|
51
51
|
if options.has_key?(:connect)
|
52
52
|
OPTIONS.fetch(options[:connect].to_sym).new(options, monitoring, seeds)
|
53
53
|
elsif options.has_key?(:replica_set)
|
54
|
-
ReplicaSet.new(options, monitoring,
|
54
|
+
ReplicaSet.new(options, monitoring, seeds)
|
55
55
|
else
|
56
56
|
Unknown.new(options, monitoring, seeds)
|
57
57
|
end
|
data/lib/mongo/collection.rb
CHANGED
@@ -100,16 +100,28 @@ module Mongo
|
|
100
100
|
@read_concern ||= options[:read_concern]
|
101
101
|
end
|
102
102
|
|
103
|
+
# Get the server selector on this collection.
|
104
|
+
#
|
105
|
+
# @example Get the server selector.
|
106
|
+
# collection.server_selector
|
107
|
+
#
|
108
|
+
# @return [ Mongo::ServerSelector ] The server selector.
|
109
|
+
#
|
110
|
+
# @since 2.0.0
|
111
|
+
def server_selector
|
112
|
+
@server_selector ||= ServerSelector.get(read_preference || database.server_selector)
|
113
|
+
end
|
114
|
+
|
103
115
|
# Get the read preference on this collection.
|
104
116
|
#
|
105
117
|
# @example Get the read preference.
|
106
118
|
# collection.read_preference
|
107
119
|
#
|
108
|
-
# @return [
|
120
|
+
# @return [ Hash ] The read preference.
|
109
121
|
#
|
110
122
|
# @since 2.0.0
|
111
123
|
def read_preference
|
112
|
-
@read_preference ||=
|
124
|
+
@read_preference ||= options[:read] || database.read_preference
|
113
125
|
end
|
114
126
|
|
115
127
|
# Get the write concern on this collection.
|
@@ -162,21 +174,28 @@ module Mongo
|
|
162
174
|
# @example Force the collection to be created.
|
163
175
|
# collection.create
|
164
176
|
#
|
177
|
+
# @param [ Hash ] options The options for the create operation.
|
178
|
+
#
|
179
|
+
# @option options [ Session ] :session The session to use for the operation.
|
180
|
+
#
|
165
181
|
# @return [ Result ] The result of the command.
|
166
182
|
#
|
167
183
|
# @since 2.0.0
|
168
|
-
def create
|
184
|
+
def create(opts = {})
|
169
185
|
operation = { :create => name }.merge(options)
|
170
186
|
operation.delete(:write)
|
171
187
|
server = next_primary
|
172
188
|
if (options[:collation] || options[Operation::COLLATION]) && !server.features.collation_enabled?
|
173
189
|
raise Error::UnsupportedCollation.new
|
174
190
|
end
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
191
|
+
client.send(:with_session, opts) do |session|
|
192
|
+
Operation::Commands::Create.new({
|
193
|
+
selector: operation,
|
194
|
+
db_name: database.name,
|
195
|
+
write_concern: write_concern,
|
196
|
+
session: session
|
197
|
+
}).execute(server)
|
198
|
+
end
|
180
199
|
end
|
181
200
|
|
182
201
|
# Drop the collection. Will also drop all indexes associated with the
|
@@ -187,16 +206,22 @@ module Mongo
|
|
187
206
|
# @example Drop the collection.
|
188
207
|
# collection.drop
|
189
208
|
#
|
209
|
+
# @param [ Hash ] options The options for the drop operation.
|
210
|
+
#
|
211
|
+
# @option options [ Session ] :session The session to use for the operation.
|
212
|
+
#
|
190
213
|
# @return [ Result ] The result of the command.
|
191
214
|
#
|
192
215
|
# @since 2.0.0
|
193
|
-
def drop
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
216
|
+
def drop(opts = {})
|
217
|
+
client.send(:with_session, opts) do |session|
|
218
|
+
Operation::Commands::Drop.new({
|
219
|
+
selector: { :drop => name },
|
220
|
+
db_name: database.name,
|
221
|
+
write_concern: write_concern,
|
222
|
+
session: session
|
223
|
+
}).execute(next_primary)
|
224
|
+
end
|
200
225
|
rescue Error::OperationFailure => ex
|
201
226
|
raise ex unless ex.message =~ /ns not found/
|
202
227
|
false
|
@@ -235,6 +260,7 @@ module Mongo
|
|
235
260
|
# @option options [ Hash ] :sort The key and direction pairs by which the result set
|
236
261
|
# will be sorted.
|
237
262
|
# @option options [ Hash ] :collation The collation to use.
|
263
|
+
# @option options [ Session ] :session The session to use.
|
238
264
|
#
|
239
265
|
# @return [ CollectionView ] The collection view.
|
240
266
|
#
|
@@ -261,6 +287,7 @@ module Mongo
|
|
261
287
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
262
288
|
# not to skip document level validation.
|
263
289
|
# @option options [ Hash ] :collation The collation to use.
|
290
|
+
# @option options [ Session ] :session The session to use.
|
264
291
|
#
|
265
292
|
# @return [ Aggregation ] The aggregation object.
|
266
293
|
#
|
@@ -269,6 +296,39 @@ module Mongo
|
|
269
296
|
View.new(self, {}).aggregate(pipeline, options)
|
270
297
|
end
|
271
298
|
|
299
|
+
# As of version 3.6 of the MongoDB server, a ``$changeStream`` pipeline stage is supported
|
300
|
+
# in the aggregation framework. This stage allows users to request that notifications are sent for
|
301
|
+
# all changes to a particular collection.
|
302
|
+
#
|
303
|
+
# @example Get change notifications for a given collection.
|
304
|
+
# collection.watch([{ '$match' => { operationType: { '$in' => ['insert', 'replace'] } } }])
|
305
|
+
#
|
306
|
+
# @param [ Array<Hash> ] pipeline Optional additional filter operators.
|
307
|
+
# @param [ Hash ] options The change stream options.
|
308
|
+
#
|
309
|
+
# @option options [ String ] :full_document Allowed values: ‘default’, ‘updateLookup’. Defaults to ‘default’.
|
310
|
+
# When set to ‘updateLookup’, the change notification for partial updates will include both a delta
|
311
|
+
# describing the changes to the document, as well as a copy of the entire document that was changed
|
312
|
+
# from some time after the change occurred.
|
313
|
+
# @option options [ BSON::Document, Hash ] :resume_after Specifies the logical starting point for the
|
314
|
+
# new change stream.
|
315
|
+
# @option options [ Integer ] :max_await_time_ms The maximum amount of time for the server to wait
|
316
|
+
# on new documents to satisfy a change stream query.
|
317
|
+
# @option options [ Integer ] :batch_size The number of documents to return per batch.
|
318
|
+
# @option options [ BSON::Document, Hash ] :collation The collation to use.
|
319
|
+
# @option options [ Session ] :session The session to use.
|
320
|
+
#
|
321
|
+
# @note A change stream only allows 'majority' read concern.
|
322
|
+
# @note This helper method is preferable to running a raw aggregation with a $changeStream stage,
|
323
|
+
# for the purpose of supporting resumability.
|
324
|
+
#
|
325
|
+
# @return [ ChangeStream ] The change stream object.
|
326
|
+
#
|
327
|
+
# @since 2.5.0
|
328
|
+
def watch(pipeline = [], options = {})
|
329
|
+
View::ChangeStream.new(View.new(self, {}, options), pipeline, options)
|
330
|
+
end
|
331
|
+
|
272
332
|
# Get a count of matching documents in the collection.
|
273
333
|
#
|
274
334
|
# @example Get the count.
|
@@ -283,6 +343,7 @@ module Mongo
|
|
283
343
|
# @option options [ Integer ] :skip The number of documents to skip before counting.
|
284
344
|
# @option options [ Hash ] :read The read preference options.
|
285
345
|
# @option options [ Hash ] :collation The collation to use.
|
346
|
+
# @option options [ Session ] :session The session to use.
|
286
347
|
#
|
287
348
|
# @return [ Integer ] The document count.
|
288
349
|
#
|
@@ -303,6 +364,7 @@ module Mongo
|
|
303
364
|
# @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command to run.
|
304
365
|
# @option options [ Hash ] :read The read preference options.
|
305
366
|
# @option options [ Hash ] :collation The collation to use.
|
367
|
+
# @option options [ Session ] :session The session to use.
|
306
368
|
#
|
307
369
|
# @return [ Array<Object> ] The list of distinct values.
|
308
370
|
#
|
@@ -319,6 +381,8 @@ module Mongo
|
|
319
381
|
#
|
320
382
|
# @param [ Hash ] options Options for getting a list of all indexes.
|
321
383
|
#
|
384
|
+
# @option options [ Session ] :session The session to use.
|
385
|
+
#
|
322
386
|
# @return [ View::Index ] The index view.
|
323
387
|
#
|
324
388
|
# @since 2.0.0
|
@@ -346,20 +410,25 @@ module Mongo
|
|
346
410
|
# @param [ Hash ] document The document to insert.
|
347
411
|
# @param [ Hash ] options The insert options.
|
348
412
|
#
|
413
|
+
# @option options [ Session ] :session The session to use for the operation.
|
414
|
+
#
|
349
415
|
# @return [ Result ] The database response wrapper.
|
350
416
|
#
|
351
417
|
# @since 2.0.0
|
352
418
|
def insert_one(document, options = {})
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
419
|
+
client.send(:with_session, options) do |session|
|
420
|
+
write_with_retry(session, Proc.new { next_primary }) do |server|
|
421
|
+
Operation::Write::Insert.new(
|
422
|
+
:documents => [ document ],
|
423
|
+
:db_name => database.name,
|
424
|
+
:coll_name => name,
|
425
|
+
:write_concern => write_concern,
|
426
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
427
|
+
:options => options,
|
428
|
+
:id_generator => client.options[:id_generator],
|
429
|
+
:session => session
|
430
|
+
).execute(server)
|
431
|
+
end
|
363
432
|
end
|
364
433
|
end
|
365
434
|
|
@@ -371,6 +440,8 @@ module Mongo
|
|
371
440
|
# @param [ Array<Hash> ] documents The documents to insert.
|
372
441
|
# @param [ Hash ] options The insert options.
|
373
442
|
#
|
443
|
+
# @option options [ Session ] :session The session to use for the operation.
|
444
|
+
#
|
374
445
|
# @return [ Result ] The database response wrapper.
|
375
446
|
#
|
376
447
|
# @since 2.0.0
|
@@ -393,6 +464,7 @@ module Mongo
|
|
393
464
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
394
465
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
395
466
|
# not to skip document level validation.
|
467
|
+
# @option options [ Session ] :session The session to use for the set of operations.
|
396
468
|
#
|
397
469
|
# @return [ BulkWrite::Result ] The result of the operation.
|
398
470
|
#
|
@@ -410,6 +482,7 @@ module Mongo
|
|
410
482
|
# @param [ Hash ] options The options.
|
411
483
|
#
|
412
484
|
# @option options [ Hash ] :collation The collation to use.
|
485
|
+
# @option options [ Session ] :session The session to use.
|
413
486
|
#
|
414
487
|
# @return [ Result ] The response from the database.
|
415
488
|
#
|
@@ -427,6 +500,7 @@ module Mongo
|
|
427
500
|
# @param [ Hash ] options The options.
|
428
501
|
#
|
429
502
|
# @option options [ Hash ] :collation The collation to use.
|
503
|
+
# @option options [ Session ] :session The session to use.
|
430
504
|
#
|
431
505
|
# @return [ Result ] The response from the database.
|
432
506
|
#
|
@@ -449,12 +523,13 @@ module Mongo
|
|
449
523
|
#
|
450
524
|
# @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command
|
451
525
|
# to run in milliseconds.
|
526
|
+
# @option options [ Session ] :session The session to use.
|
452
527
|
#
|
453
528
|
# @return [ Array<Cursor> ] An array of cursors.
|
454
529
|
#
|
455
530
|
# @since 2.1
|
456
531
|
def parallel_scan(cursor_count, options = {})
|
457
|
-
find.send(:parallel_scan, cursor_count, options)
|
532
|
+
find({}, options).send(:parallel_scan, cursor_count, options)
|
458
533
|
end
|
459
534
|
|
460
535
|
# Replaces a single document in the collection with the new document.
|
@@ -471,6 +546,7 @@ module Mongo
|
|
471
546
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
472
547
|
# not to skip document level validation.
|
473
548
|
# @option options [ Hash ] :collation The collation to use.
|
549
|
+
# @option options [ Session ] :session The session to use.
|
474
550
|
#
|
475
551
|
# @return [ Result ] The response from the database.
|
476
552
|
#
|
@@ -493,6 +569,9 @@ module Mongo
|
|
493
569
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
494
570
|
# not to skip document level validation.
|
495
571
|
# @option options [ Hash ] :collation The collation to use.
|
572
|
+
# @option options [ Array ] :array_filters A set of filters specifying to which array elements
|
573
|
+
# an update should apply.
|
574
|
+
# @option options [ Session ] :session The session to use.
|
496
575
|
#
|
497
576
|
# @return [ Result ] The response from the database.
|
498
577
|
#
|
@@ -515,6 +594,9 @@ module Mongo
|
|
515
594
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
516
595
|
# not to skip document level validation.
|
517
596
|
# @option options [ Hash ] :collation The collation to use.
|
597
|
+
# @option options [ Array ] :array_filters A set of filters specifying to which array elements
|
598
|
+
# an update should apply.
|
599
|
+
# @option options [ Session ] :session The session to use.
|
518
600
|
#
|
519
601
|
# @return [ Result ] The response from the database.
|
520
602
|
#
|
@@ -540,12 +622,13 @@ module Mongo
|
|
540
622
|
# @option options [ Hash ] :write_concern The write concern options.
|
541
623
|
# Defaults to the collection's write concern.
|
542
624
|
# @option options [ Hash ] :collation The collation to use.
|
625
|
+
# @option options [ Session ] :session The session to use.
|
543
626
|
#
|
544
627
|
# @return [ BSON::Document, nil ] The document, if found.
|
545
628
|
#
|
546
629
|
# @since 2.1.0
|
547
630
|
def find_one_and_delete(filter, options = {})
|
548
|
-
find(filter, options).find_one_and_delete
|
631
|
+
find(filter, options).find_one_and_delete(options)
|
549
632
|
end
|
550
633
|
|
551
634
|
# Finds a single document via findAndModify and updates it, returning the original doc unless
|
@@ -573,6 +656,9 @@ module Mongo
|
|
573
656
|
# @option options [ Hash ] :write_concern The write concern options.
|
574
657
|
# Defaults to the collection's write concern.
|
575
658
|
# @option options [ Hash ] :collation The collation to use.
|
659
|
+
# @option options [ Array ] :array_filters A set of filters specifying to which array elements
|
660
|
+
# an update should apply.
|
661
|
+
# @option options [ Session ] :session The session to use.
|
576
662
|
#
|
577
663
|
# @return [ BSON::Document ] The document.
|
578
664
|
#
|
@@ -606,6 +692,7 @@ module Mongo
|
|
606
692
|
# @option options [ Hash ] :write_concern The write concern options.
|
607
693
|
# Defaults to the collection's write concern.
|
608
694
|
# @option options [ Hash ] :collation The collation to use.
|
695
|
+
# @option options [ Session ] :session The session to use.
|
609
696
|
#
|
610
697
|
# @return [ BSON::Document ] The document.
|
611
698
|
#
|