mongo 2.3.1 → 2.4.0.rc0
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 +0 -0
- data.tar.gz.sig +2 -3
- data/lib/mongo/bulk_write.rb +8 -7
- data/lib/mongo/bulk_write/combineable.rb +4 -0
- data/lib/mongo/bulk_write/transformable.rb +17 -5
- data/lib/mongo/bulk_write/validatable.rb +1 -0
- data/lib/mongo/client.rb +3 -0
- data/lib/mongo/cluster.rb +8 -0
- data/lib/mongo/cluster/app_metadata.rb +135 -0
- data/lib/mongo/collection.rb +42 -10
- data/lib/mongo/collection/view.rb +15 -1
- data/lib/mongo/collection/view/aggregation.rb +5 -0
- data/lib/mongo/collection/view/builder/aggregation.rb +13 -3
- data/lib/mongo/collection/view/builder/find_command.rb +7 -21
- data/lib/mongo/collection/view/builder/map_reduce.rb +22 -5
- data/lib/mongo/collection/view/iterable.rb +1 -0
- data/lib/mongo/collection/view/map_reduce.rb +5 -0
- data/lib/mongo/collection/view/readable.rb +35 -14
- data/lib/mongo/collection/view/writable.rb +54 -23
- data/lib/mongo/cursor/builder/get_more_command.rb +2 -3
- data/lib/mongo/database.rb +10 -2
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/error/invalid_application_name.rb +38 -0
- data/lib/mongo/error/invalid_server_preference.rb +24 -3
- data/lib/mongo/error/unsupported_collation.rb +51 -0
- data/lib/mongo/index/view.rb +28 -15
- data/lib/mongo/operation.rb +6 -0
- data/lib/mongo/operation/commands.rb +3 -0
- data/lib/mongo/operation/commands/aggregate.rb +10 -10
- data/lib/mongo/operation/commands/create.rb +45 -0
- data/lib/mongo/operation/commands/drop.rb +45 -0
- data/lib/mongo/operation/commands/drop_database.rb +45 -0
- data/lib/mongo/operation/commands/map_reduce.rb +12 -1
- data/lib/mongo/operation/commands/parallel_scan.rb +1 -0
- data/lib/mongo/operation/read_preference.rb +9 -9
- data/lib/mongo/operation/specifiable.rb +34 -0
- data/lib/mongo/operation/takes_write_concern.rb +35 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +1 -1
- data/lib/mongo/operation/write/command/create_index.rb +6 -0
- data/lib/mongo/operation/write/command/drop_index.rb +6 -0
- data/lib/mongo/operation/write/command/insert.rb +1 -1
- data/lib/mongo/operation/write/command/update.rb +1 -0
- data/lib/mongo/operation/write/command/writable.rb +2 -2
- data/lib/mongo/operation/write/create_index.rb +2 -2
- data/lib/mongo/operation/write/create_user.rb +1 -1
- data/lib/mongo/operation/write/delete.rb +5 -1
- data/lib/mongo/operation/write/gle.rb +1 -1
- data/lib/mongo/operation/write/insert.rb +2 -2
- data/lib/mongo/operation/write/remove_user.rb +1 -1
- data/lib/mongo/operation/write/update.rb +5 -1
- data/lib/mongo/operation/write/update_user.rb +1 -1
- data/lib/mongo/operation/write/write_command_enabled.rb +10 -2
- data/lib/mongo/protocol/insert.rb +1 -2
- data/lib/mongo/protocol/query.rb +3 -7
- data/lib/mongo/server.rb +8 -3
- data/lib/mongo/server/connection.rb +17 -11
- data/lib/mongo/server/description.rb +22 -0
- data/lib/mongo/server/description/features.rb +2 -0
- data/lib/mongo/server/monitor.rb +5 -0
- data/lib/mongo/server/monitor/connection.rb +11 -0
- data/lib/mongo/server_selector/nearest.rb +9 -6
- data/lib/mongo/server_selector/primary.rb +4 -0
- data/lib/mongo/server_selector/primary_preferred.rb +7 -1
- data/lib/mongo/server_selector/secondary.rb +5 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
- data/lib/mongo/server_selector/selectable.rb +57 -10
- data/lib/mongo/socket/ssl.rb +1 -0
- data/lib/mongo/uri.rb +4 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +1 -0
- data/mongo.gemspec +1 -1
- data/spec/mongo/auth/cr_spec.rb +7 -1
- data/spec/mongo/auth/ldap_spec.rb +7 -1
- data/spec/mongo/auth/scram_spec.rb +7 -1
- data/spec/mongo/auth/x509_spec.rb +7 -1
- data/spec/mongo/bulk_write_spec.rb +598 -5
- data/spec/mongo/client_spec.rb +47 -1
- data/spec/mongo/cluster/app_metadata_spec.rb +104 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +14 -8
- data/spec/mongo/cluster/topology/sharded_spec.rb +9 -3
- data/spec/mongo/cluster/topology/single_spec.rb +10 -4
- data/spec/mongo/cluster_spec.rb +29 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +139 -0
- data/spec/mongo/collection/view/builder/find_command_spec.rb +6 -243
- data/spec/mongo/collection/view/map_reduce_spec.rb +104 -0
- data/spec/mongo/collection/view/readable_spec.rb +83 -0
- data/spec/mongo/collection/view/writable_spec.rb +447 -1
- data/spec/mongo/collection/view_spec.rb +57 -0
- data/spec/mongo/collection_spec.rb +926 -101
- data/spec/mongo/crud_spec.rb +4 -5
- data/spec/mongo/database_spec.rb +99 -1
- data/spec/mongo/index/view_spec.rb +360 -31
- data/spec/mongo/max_staleness_spec.rb +108 -0
- data/spec/mongo/operation/read_preference_spec.rb +8 -8
- data/spec/mongo/operation/write/command/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/command/insert_spec.rb +1 -1
- data/spec/mongo/operation/write/command/update_spec.rb +1 -1
- data/spec/mongo/server/connection_pool_spec.rb +3 -1
- data/spec/mongo/server/connection_spec.rb +17 -7
- data/spec/mongo/server/description/features_spec.rb +50 -0
- data/spec/mongo/server/description_spec.rb +9 -3
- data/spec/mongo/server_selection_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +73 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +73 -0
- data/spec/mongo/server_selector/primary_spec.rb +36 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +73 -0
- data/spec/mongo/server_selector/secondary_spec.rb +73 -0
- data/spec/mongo/server_selector_spec.rb +53 -0
- data/spec/mongo/server_spec.rb +3 -1
- data/spec/mongo/uri_spec.rb +54 -0
- data/spec/mongo/write_concern_spec.rb +18 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/authorization.rb +8 -1
- data/spec/support/crud.rb +15 -0
- data/spec/support/crud/read.rb +27 -19
- data/spec/support/crud/write.rb +28 -3
- data/spec/support/crud_tests/read/aggregate.yml +15 -3
- data/spec/support/crud_tests/read/count.yml +14 -3
- data/spec/support/crud_tests/read/distinct.yml +13 -1
- data/spec/support/crud_tests/read/find.yml +12 -2
- data/spec/support/crud_tests/write/deleteMany.yml +22 -1
- data/spec/support/crud_tests/write/deleteOne.yml +20 -1
- data/spec/support/crud_tests/write/findOneAndDelete.yml +27 -2
- data/spec/support/crud_tests/write/findOneAndReplace.yml +43 -14
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +50 -8
- data/spec/support/crud_tests/write/replaceOne.yml +34 -10
- data/spec/support/crud_tests/write/updateMany.yml +42 -11
- data/spec/support/crud_tests/write/updateOne.yml +32 -7
- data/spec/support/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +25 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness.yml +29 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness2.yml +29 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +27 -0
- data/spec/support/max_staleness/Sharded/Incompatible.yml +25 -0
- data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +20 -0
- data/spec/support/max_staleness/Single/Incompatible.yml +18 -0
- data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +20 -0
- data/spec/support/server_selection.rb +25 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +34 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
- data/spec/support/shared/server_selector.rb +4 -3
- metadata +91 -6
- metadata.gz.sig +0 -0
@@ -56,7 +56,12 @@ module Mongo
|
|
56
56
|
attr_reader :filter
|
57
57
|
|
58
58
|
# Delegate necessary operations to the collection.
|
59
|
-
def_delegators :collection,
|
59
|
+
def_delegators :collection,
|
60
|
+
:client,
|
61
|
+
:cluster,
|
62
|
+
:database,
|
63
|
+
:read_preference,
|
64
|
+
:write_concern
|
60
65
|
|
61
66
|
# Delegate to the cluster for the next primary.
|
62
67
|
def_delegators :cluster, :next_primary
|
@@ -127,6 +132,7 @@ module Mongo
|
|
127
132
|
# once.
|
128
133
|
# @option options :sort [ Hash ] The key and direction pairs used to sort the
|
129
134
|
# results.
|
135
|
+
# @option options [ Hash ] :collation The collation to use.
|
130
136
|
#
|
131
137
|
# @since 2.0.0
|
132
138
|
def initialize(collection, filter = {}, options = {})
|
@@ -150,6 +156,10 @@ module Mongo
|
|
150
156
|
|
151
157
|
private
|
152
158
|
|
159
|
+
def write_concern
|
160
|
+
WriteConcern.get(options[:write] || options[:write_concern] || collection.write_concern)
|
161
|
+
end
|
162
|
+
|
153
163
|
def initialize_copy(other)
|
154
164
|
@collection = other.collection
|
155
165
|
@options = other.options.dup
|
@@ -167,6 +177,10 @@ module Mongo
|
|
167
177
|
View.new(collection, filter, options)
|
168
178
|
end
|
169
179
|
|
180
|
+
def validate_collation!(server, opts)
|
181
|
+
raise Error::UnsupportedCollation.new if opts[:collation] && !server.features.collation_enabled?
|
182
|
+
end
|
183
|
+
|
170
184
|
def view; self; end
|
171
185
|
end
|
172
186
|
end
|
@@ -115,8 +115,13 @@ module Mongo
|
|
115
115
|
log_warn(REROUTE)
|
116
116
|
server = cluster.next_primary(false)
|
117
117
|
end
|
118
|
+
validate_collation!(server)
|
118
119
|
initial_query_op.execute(server)
|
119
120
|
end
|
121
|
+
|
122
|
+
def validate_collation!(server)
|
123
|
+
raise Error::UnsupportedCollation.new if @options[:collation] && !server.features.collation_enabled?
|
124
|
+
end
|
120
125
|
end
|
121
126
|
end
|
122
127
|
end
|
@@ -30,10 +30,11 @@ module Mongo
|
|
30
30
|
:allow_disk_use => 'allowDiskUse',
|
31
31
|
:max_time_ms => 'maxTimeMS',
|
32
32
|
:explain => 'explain',
|
33
|
-
:bypass_document_validation => 'bypassDocumentValidation'
|
33
|
+
:bypass_document_validation => 'bypassDocumentValidation',
|
34
|
+
:collation => 'collation'
|
34
35
|
).freeze
|
35
36
|
|
36
|
-
def_delegators :@view, :collection, :database, :read
|
37
|
+
def_delegators :@view, :collection, :database, :read, :write_concern
|
37
38
|
|
38
39
|
# @return [ Array<Hash> ] pipeline The pipeline.
|
39
40
|
attr_reader :pipeline
|
@@ -69,11 +70,20 @@ module Mongo
|
|
69
70
|
#
|
70
71
|
# @since 2.2.0
|
71
72
|
def specification
|
72
|
-
|
73
|
+
spec = {
|
74
|
+
selector: aggregation_command,
|
75
|
+
db_name: database.name,
|
76
|
+
read: read
|
77
|
+
}
|
78
|
+
write? ? spec.merge!(write_concern: write_concern) : spec
|
73
79
|
end
|
74
80
|
|
75
81
|
private
|
76
82
|
|
83
|
+
def write?
|
84
|
+
pipeline.any? { |operator| operator[:$out] || operator['$out'] }
|
85
|
+
end
|
86
|
+
|
77
87
|
def aggregation_command
|
78
88
|
command = BSON::Document.new(:aggregate => collection.name, :pipeline => pipeline)
|
79
89
|
command[:cursor] = cursor if cursor
|
@@ -48,7 +48,8 @@ module Mongo
|
|
48
48
|
no_cursor_timeout: 'noCursorTimeout',
|
49
49
|
await_data: 'awaitData',
|
50
50
|
allow_partial_results: 'allowPartialResults',
|
51
|
-
read_concern: 'readConcern'
|
51
|
+
read_concern: 'readConcern',
|
52
|
+
collation: 'collation'
|
52
53
|
).freeze
|
53
54
|
|
54
55
|
def_delegators :@view, :collection, :database, :filter, :options, :read
|
@@ -95,30 +96,15 @@ module Mongo
|
|
95
96
|
def find_command
|
96
97
|
document = BSON::Document.new('find' => collection.name, 'filter' => filter)
|
97
98
|
command = Options::Mapper.transform_documents(convert_flags(options), MAPPINGS, document)
|
98
|
-
|
99
|
-
command
|
99
|
+
convert_negative_limit(command)
|
100
100
|
end
|
101
101
|
|
102
|
-
def
|
103
|
-
if command[:limit] && command[:limit] < 0
|
104
|
-
|
105
|
-
|
106
|
-
command[:limit] = command[:limit].abs
|
107
|
-
command[:batchSize] = command[:limit].abs
|
102
|
+
def convert_negative_limit(command)
|
103
|
+
if command[:limit] && command[:limit] < 0
|
104
|
+
command['limit'] = command['limit'].abs
|
108
105
|
command[:singleBatch] = true
|
109
|
-
|
110
|
-
else
|
111
|
-
[:limit, :batchSize].each do |opt|
|
112
|
-
if command[opt]
|
113
|
-
if command[opt] < 0
|
114
|
-
command[opt] = command[opt].abs
|
115
|
-
command[:singleBatch] = true
|
116
|
-
elsif command[opt] == 0
|
117
|
-
command.delete(opt)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
106
|
end
|
107
|
+
command
|
122
108
|
end
|
123
109
|
|
124
110
|
def convert_flags(options)
|
@@ -32,10 +32,11 @@ module Mongo
|
|
32
32
|
out: 'out',
|
33
33
|
scope: 'scope',
|
34
34
|
verbose: 'verbose',
|
35
|
-
bypass_document_validation: 'bypassDocumentValidation'
|
35
|
+
bypass_document_validation: 'bypassDocumentValidation',
|
36
|
+
collation: 'collation'
|
36
37
|
).freeze
|
37
38
|
|
38
|
-
def_delegators :@view, :collection, :database, :filter, :read
|
39
|
+
def_delegators :@view, :collection, :database, :filter, :read, :write_concern
|
39
40
|
|
40
41
|
# @return [ String ] map The map function.
|
41
42
|
attr_reader :map
|
@@ -77,7 +78,11 @@ module Mongo
|
|
77
78
|
#
|
78
79
|
# @since 2.2.0
|
79
80
|
def command_specification
|
80
|
-
{
|
81
|
+
{
|
82
|
+
selector: find_command,
|
83
|
+
db_name: database.name,
|
84
|
+
read: read
|
85
|
+
}
|
81
86
|
end
|
82
87
|
|
83
88
|
# Get the specification for the document query after a map/reduce.
|
@@ -101,11 +106,23 @@ module Mongo
|
|
101
106
|
#
|
102
107
|
# @since 2.2.0
|
103
108
|
def specification
|
104
|
-
|
109
|
+
spec = {
|
110
|
+
selector: map_reduce_command,
|
111
|
+
db_name: database.name,
|
112
|
+
read: read
|
113
|
+
}
|
114
|
+
write?(spec) ? spec.merge!(write_concern: write_concern) : spec
|
105
115
|
end
|
106
116
|
|
107
117
|
private
|
108
118
|
|
119
|
+
def write?(spec)
|
120
|
+
if out = spec[:selector][:out]
|
121
|
+
out.is_a?(String) ||
|
122
|
+
(out.respond_to?(:keys) && out.keys.first.to_s.downcase != View::MapReduce::INLINE)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
109
126
|
def find_command
|
110
127
|
BSON::Document.new('find' => query_collection, 'filter' => {})
|
111
128
|
end
|
@@ -119,8 +136,8 @@ module Mongo
|
|
119
136
|
:out => { inline: 1 }
|
120
137
|
)
|
121
138
|
command[:readConcern] = collection.read_concern if collection.read_concern
|
122
|
-
command.merge!(Options::Mapper.transform_documents(options, MAPPINGS))
|
123
139
|
command.merge!(view.options)
|
140
|
+
command.merge!(Options::Mapper.transform_documents(options, MAPPINGS))
|
124
141
|
command
|
125
142
|
end
|
126
143
|
|
@@ -211,6 +211,7 @@ module Mongo
|
|
211
211
|
log_warn(REROUTE)
|
212
212
|
server = cluster.next_primary(false)
|
213
213
|
end
|
214
|
+
validate_collation!(server)
|
214
215
|
result = initial_query_op.execute(server)
|
215
216
|
inline? ? result : send_fetch_query(server)
|
216
217
|
end
|
@@ -234,6 +235,10 @@ module Mongo
|
|
234
235
|
def send_fetch_query(server)
|
235
236
|
fetch_query_op(server).execute(server)
|
236
237
|
end
|
238
|
+
|
239
|
+
def validate_collation!(server)
|
240
|
+
raise Error::UnsupportedCollation.new if options[:collation] && !server.features.collation_enabled?
|
241
|
+
end
|
237
242
|
end
|
238
243
|
end
|
239
244
|
end
|
@@ -121,6 +121,7 @@ module Mongo
|
|
121
121
|
# @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
|
122
122
|
# command to run.
|
123
123
|
# @option options [ Hash ] :read The read preference options.
|
124
|
+
# @option options [ Hash ] :collation The collation to use.
|
124
125
|
#
|
125
126
|
# @return [ Integer ] The document count.
|
126
127
|
#
|
@@ -132,9 +133,18 @@ module Mongo
|
|
132
133
|
cmd[:limit] = options[:limit] if options[:limit]
|
133
134
|
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
134
135
|
cmd[:readConcern] = collection.read_concern if collection.read_concern
|
136
|
+
preference = ServerSelector.get(options[:read] || read_preference)
|
137
|
+
server = preference.select_server(cluster)
|
138
|
+
validate_collation!(server, options)
|
139
|
+
cmd[:collation] = options[:collation] if options[:collation]
|
135
140
|
read_with_retry do
|
136
|
-
|
137
|
-
|
141
|
+
Operation::Commands::Command.new({
|
142
|
+
:selector => cmd,
|
143
|
+
:db_name => database.name,
|
144
|
+
:options => { :limit => -1 },
|
145
|
+
:read => preference,
|
146
|
+
}).execute(server).n.to_i
|
147
|
+
|
138
148
|
end
|
139
149
|
end
|
140
150
|
|
@@ -149,6 +159,7 @@ module Mongo
|
|
149
159
|
# @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
|
150
160
|
# command to run.
|
151
161
|
# @option options [ Hash ] :read The read preference options.
|
162
|
+
# @option options [ Hash ] :collation The collation to use.
|
152
163
|
#
|
153
164
|
# @return [ Array<Object> ] The list of distinct values.
|
154
165
|
#
|
@@ -159,9 +170,18 @@ module Mongo
|
|
159
170
|
:query => filter }
|
160
171
|
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
161
172
|
cmd[:readConcern] = collection.read_concern if collection.read_concern
|
173
|
+
preference = ServerSelector.get(options[:read] || read_preference)
|
174
|
+
server = preference.select_server(cluster)
|
175
|
+
validate_collation!(server, options)
|
176
|
+
cmd[:collation] = options[:collation] if options[:collation]
|
162
177
|
read_with_retry do
|
163
|
-
|
164
|
-
|
178
|
+
Operation::Commands::Command.new({
|
179
|
+
:selector => cmd,
|
180
|
+
:db_name => database.name,
|
181
|
+
:options => { :limit => -1 },
|
182
|
+
:read => preference
|
183
|
+
}).execute(server).first['values']
|
184
|
+
|
165
185
|
end
|
166
186
|
end
|
167
187
|
|
@@ -439,21 +459,22 @@ module Mongo
|
|
439
459
|
options[:read] || read_preference
|
440
460
|
end
|
441
461
|
|
442
|
-
def parallel_scan(cursor_count)
|
462
|
+
def parallel_scan(cursor_count, options = {})
|
443
463
|
server = read.select_server(cluster, false)
|
444
|
-
Operation::Commands::ParallelScan.new(
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
464
|
+
cmd = Operation::Commands::ParallelScan.new({
|
465
|
+
:coll_name => collection.name,
|
466
|
+
:db_name => database.name,
|
467
|
+
:cursor_count => cursor_count,
|
468
|
+
:read_concern => collection.read_concern
|
469
|
+
}.merge!(options))
|
470
|
+
cmd.execute(server).cursor_ids.map do |cursor_id|
|
450
471
|
result = if server.features.find_command_enabled?
|
451
|
-
|
472
|
+
Operation::Commands::GetMore.new({
|
452
473
|
:selector => { :getMore => cursor_id, :collection => collection.name },
|
453
474
|
:db_name => database.name
|
454
475
|
}).execute(server)
|
455
|
-
|
456
|
-
|
476
|
+
else
|
477
|
+
Operation::Read::GetMore.new({
|
457
478
|
:to_return => 0,
|
458
479
|
:cursor_id => cursor_id,
|
459
480
|
:db_name => database.name,
|
@@ -35,11 +35,17 @@ module Mongo
|
|
35
35
|
cmd[:fields] = projection if projection
|
36
36
|
cmd[:sort] = sort if sort
|
37
37
|
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
cmd[:writeConcern] = write_concern.options if write_concern
|
39
|
+
|
40
|
+
server = next_primary
|
41
|
+
validate_collation!(server, options)
|
42
|
+
cmd[:collation] = options[:collation] if options[:collation]
|
43
|
+
|
41
44
|
write_with_retry do
|
42
|
-
|
45
|
+
Operation::Commands::Command.new({
|
46
|
+
:selector => cmd,
|
47
|
+
:db_name => database.name
|
48
|
+
}).execute(server).first['value']
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
@@ -80,7 +86,7 @@ module Mongo
|
|
80
86
|
# @option opts [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
81
87
|
# @option opts [ true, false ] :bypass_document_validation Whether or
|
82
88
|
# not to skip document level validation.
|
83
|
-
# @option
|
89
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
84
90
|
# Defaults to the collection's write concern.
|
85
91
|
#
|
86
92
|
# @return [ BSON::Document ] The document.
|
@@ -95,13 +101,19 @@ module Mongo
|
|
95
101
|
cmd[:upsert] = opts[:upsert] if opts[:upsert]
|
96
102
|
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
97
103
|
cmd[:bypassDocumentValidation] = !!opts[:bypass_document_validation]
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
+
cmd[:writeConcern] = write_concern.options if write_concern
|
105
|
+
|
106
|
+
server = next_primary
|
107
|
+
validate_collation!(server, options)
|
108
|
+
cmd[:collation] = options[:collation] if options[:collation]
|
109
|
+
|
110
|
+
value = write_with_retry do
|
111
|
+
Operation::Commands::Command.new({
|
112
|
+
:selector => cmd,
|
113
|
+
:db_name => database.name
|
114
|
+
}).execute(server).first['value']
|
104
115
|
end
|
116
|
+
value unless value.nil? || value.empty?
|
105
117
|
end
|
106
118
|
|
107
119
|
# Remove documents from the collection.
|
@@ -109,11 +121,15 @@ module Mongo
|
|
109
121
|
# @example Remove multiple documents from the collection.
|
110
122
|
# collection_view.delete_many
|
111
123
|
#
|
124
|
+
# @param [ Hash ] opts The options.
|
125
|
+
#
|
126
|
+
# @option opts [ Hash ] :collation The collation to use.
|
127
|
+
#
|
112
128
|
# @return [ Result ] The response from the database.
|
113
129
|
#
|
114
130
|
# @since 2.0.0
|
115
|
-
def delete_many
|
116
|
-
remove(0)
|
131
|
+
def delete_many(opts = {})
|
132
|
+
remove(0, opts)
|
117
133
|
end
|
118
134
|
|
119
135
|
# Remove a document from the collection.
|
@@ -121,11 +137,15 @@ module Mongo
|
|
121
137
|
# @example Remove a single document from the collection.
|
122
138
|
# collection_view.delete_one
|
123
139
|
#
|
140
|
+
# @param [ Hash ] opts The options.
|
141
|
+
#
|
142
|
+
# @option opts [ Hash ] :collation The collation to use.
|
143
|
+
#
|
124
144
|
# @return [ Result ] The response from the database.
|
125
145
|
#
|
126
146
|
# @since 2.0.0
|
127
|
-
def delete_one
|
128
|
-
remove(1)
|
147
|
+
def delete_one(opts = {})
|
148
|
+
remove(1, opts)
|
129
149
|
end
|
130
150
|
|
131
151
|
# Replaces a single document in the database with the new document.
|
@@ -138,6 +158,7 @@ module Mongo
|
|
138
158
|
#
|
139
159
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
140
160
|
# document doesn't exist.
|
161
|
+
# @option opts [ Hash ] :collation The collation to use.
|
141
162
|
#
|
142
163
|
# @return [ Result ] The response from the database.
|
143
164
|
#
|
@@ -156,6 +177,7 @@ module Mongo
|
|
156
177
|
#
|
157
178
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
158
179
|
# document doesn't exist.
|
180
|
+
# @option opts [ Hash ] :collation The collation to use.
|
159
181
|
#
|
160
182
|
# @return [ Result ] The response from the database.
|
161
183
|
#
|
@@ -174,6 +196,7 @@ module Mongo
|
|
174
196
|
#
|
175
197
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
176
198
|
# document doesn't exist.
|
199
|
+
# @option opts [ Hash ] :collation The collation to use.
|
177
200
|
#
|
178
201
|
# @return [ Result ] The response from the database.
|
179
202
|
#
|
@@ -184,29 +207,37 @@ module Mongo
|
|
184
207
|
|
185
208
|
private
|
186
209
|
|
187
|
-
def remove(value)
|
210
|
+
def remove(value, opts)
|
211
|
+
server = next_primary
|
212
|
+
validate_collation!(server, opts)
|
213
|
+
delete_doc = { Operation::Q => filter, Operation::LIMIT => value }
|
214
|
+
delete_doc[:collation] = opts[:collation] if opts[:collation]
|
188
215
|
write_with_retry do
|
189
216
|
Operation::Write::Delete.new(
|
190
|
-
:delete =>
|
217
|
+
:delete => delete_doc,
|
191
218
|
:db_name => collection.database.name,
|
192
219
|
:coll_name => collection.name,
|
193
220
|
:write_concern => collection.write_concern
|
194
|
-
).execute(
|
221
|
+
).execute(server)
|
195
222
|
end
|
196
223
|
end
|
197
224
|
|
198
225
|
def update(spec, multi, opts)
|
226
|
+
server = next_primary
|
227
|
+
validate_collation!(server, opts)
|
228
|
+
update_doc = { Operation::Q => filter,
|
229
|
+
Operation::U => spec,
|
230
|
+
Operation::MULTI => multi,
|
231
|
+
Operation::UPSERT => !!opts[:upsert] }
|
232
|
+
update_doc[:collation] = opts[:collation] if opts[:collation]
|
199
233
|
write_with_retry do
|
200
234
|
Operation::Write::Update.new(
|
201
|
-
:update =>
|
202
|
-
Operation::U => spec,
|
203
|
-
Operation::MULTI => multi,
|
204
|
-
Operation::UPSERT => !!opts[:upsert] },
|
235
|
+
:update => update_doc,
|
205
236
|
:db_name => collection.database.name,
|
206
237
|
:coll_name => collection.name,
|
207
238
|
:write_concern => collection.write_concern,
|
208
239
|
:bypass_document_validation => !!opts[:bypass_document_validation]
|
209
|
-
).execute(
|
240
|
+
).execute(server)
|
210
241
|
end
|
211
242
|
end
|
212
243
|
end
|