mongo 2.0.6 → 2.1.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 +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +2 -0
- data/lib/mongo/bulk_write.rb +1 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
- data/lib/mongo/bulk_write/deletable.rb +8 -7
- data/lib/mongo/bulk_write/insertable.rb +4 -3
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
- data/lib/mongo/bulk_write/replacable.rb +4 -3
- data/lib/mongo/bulk_write/result.rb +138 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
- data/lib/mongo/bulk_write/updatable.rb +8 -7
- data/lib/mongo/client.rb +36 -4
- data/lib/mongo/cluster.rb +39 -4
- data/lib/mongo/cluster/topology/replica_set.rb +20 -4
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/collection.rb +282 -29
- data/lib/mongo/collection/view/aggregation.rb +32 -4
- data/lib/mongo/collection/view/iterable.rb +2 -1
- data/lib/mongo/collection/view/map_reduce.rb +3 -1
- data/lib/mongo/collection/view/readable.rb +89 -14
- data/lib/mongo/collection/view/writable.rb +11 -5
- data/lib/mongo/cursor.rb +11 -3
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error.rb +6 -2
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/fs.rb +2 -5
- data/lib/mongo/monitoring.rb +199 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
- data/lib/mongo/monitoring/event.rb +17 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +88 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
- data/lib/mongo/monitoring/publishable.rb +96 -0
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/executable.rb +1 -1
- data/lib/mongo/operation/parallel_scan.rb +76 -0
- data/lib/mongo/operation/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/specifiable.rb +18 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
- data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
- data/lib/mongo/protocol/delete.rb +8 -13
- data/lib/mongo/protocol/get_more.rb +13 -13
- data/lib/mongo/protocol/insert.rb +8 -13
- data/lib/mongo/protocol/kill_cursors.rb +7 -11
- data/lib/mongo/protocol/query.rb +58 -20
- data/lib/mongo/protocol/reply.rb +12 -0
- data/lib/mongo/protocol/update.rb +13 -14
- data/lib/mongo/server.rb +23 -2
- data/lib/mongo/server/connectable.rb +0 -22
- data/lib/mongo/server/connection.rb +29 -0
- data/lib/mongo/server/description.rb +23 -1
- data/lib/mongo/server/monitor.rb +17 -1
- data/lib/mongo/server/monitor/connection.rb +24 -0
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +12 -5
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
- data/spec/mongo/client_spec.rb +42 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +251 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +233 -71
- data/spec/mongo/collection_spec.rb +905 -9
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
- data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +2 -2
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/query_spec.rb +0 -29
- data/spec/mongo/server/connection_pool_spec.rb +18 -6
- data/spec/mongo/server/connection_spec.rb +12 -4
- data/spec/mongo/server/description_spec.rb +7 -3
- data/spec/mongo/server/monitor_spec.rb +30 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
- data/spec/mongo/server_selection_spec.rb +14 -6
- data/spec/mongo/server_spec.rb +27 -8
- data/spec/mongo/socket/ssl_spec.rb +94 -8
- data/spec/mongo/uri_spec.rb +25 -9
- data/spec/spec_helper.rb +29 -20
- data/spec/support/authorization.rb +19 -4
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/crud/read.rb +9 -10
- data/spec/support/crud/write.rb +24 -20
- data/spec/support/sdam/rs/equal_electionids.yml +45 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- data/spec/support/server_discovery_and_monitoring.rb +19 -2
- data/spec/support/shared/bulk_write.rb +26 -22
- data/spec/support/shared/server_selector.rb +2 -1
- metadata +31 -7
- metadata.gz.sig +0 -0
- data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -37,6 +37,15 @@ module Mongo
|
|
37
37
|
# Delegate necessary operations to the collection.
|
38
38
|
def_delegators :collection, :database
|
39
39
|
|
40
|
+
# Options mapping for an aggregation.
|
41
|
+
#
|
42
|
+
# @since 2.1.0
|
43
|
+
OPTIONS_MAP = {
|
44
|
+
:allow_disk_use => :allowDiskUse,
|
45
|
+
:max_time_ms => :maxTimeMS,
|
46
|
+
:explain => :explain
|
47
|
+
}
|
48
|
+
|
40
49
|
# Set to true if disk usage is allowed during the aggregation.
|
41
50
|
#
|
42
51
|
# @example Set disk usage flag.
|
@@ -49,7 +58,7 @@ module Mongo
|
|
49
58
|
#
|
50
59
|
# @since 2.0.0
|
51
60
|
def allow_disk_use(value = nil)
|
52
|
-
configure(
|
61
|
+
configure(__method__, value)
|
53
62
|
end
|
54
63
|
|
55
64
|
# Initialize the aggregation for the provided collection view, pipeline
|
@@ -89,11 +98,28 @@ module Mongo
|
|
89
98
|
:selector => {
|
90
99
|
:aggregate => collection.name,
|
91
100
|
:pipeline => pipeline,
|
92
|
-
:cursor =>
|
93
|
-
}.merge!(
|
101
|
+
:cursor => cursor,
|
102
|
+
}.merge!(agg_options)
|
94
103
|
}
|
95
104
|
end
|
96
105
|
|
106
|
+
def agg_options
|
107
|
+
@agg_options ||= options.each.reduce({}) do |opts, (key, value)|
|
108
|
+
OPTIONS_MAP[key] ? opts.merge!(OPTIONS_MAP[key] => value) : opts
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def cursor
|
113
|
+
if options[:use_cursor] == true || options[:use_cursor].nil?
|
114
|
+
batch_size_doc
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def batch_size_doc
|
119
|
+
(value = options[:batch_size] || view.batch_size) ?
|
120
|
+
{ :batchSize => value } : {}
|
121
|
+
end
|
122
|
+
|
97
123
|
def explain_options
|
98
124
|
{ :explain => true }
|
99
125
|
end
|
@@ -110,7 +136,9 @@ module Mongo
|
|
110
136
|
begin
|
111
137
|
initial_query_op.execute(server.context)
|
112
138
|
rescue Mongo::Error::NeedPrimaryServer
|
113
|
-
|
139
|
+
log_warn([
|
140
|
+
'Rerouting the Aggregation operation to the primary server.'
|
141
|
+
])
|
114
142
|
server = ServerSelector.get(mode: :primary).select_server(cluster)
|
115
143
|
initial_query_op.execute(server.context)
|
116
144
|
end
|
@@ -36,7 +36,8 @@ module Mongo
|
|
36
36
|
# @yieldparam [ Hash ] Each matching document.
|
37
37
|
def each
|
38
38
|
server = read.select_server(cluster)
|
39
|
-
|
39
|
+
initial_query = send_initial_query(server)
|
40
|
+
cursor = Cursor.new(view, initial_query, server).to_enum
|
40
41
|
cursor.each do |doc|
|
41
42
|
yield doc
|
42
43
|
end if block_given?
|
@@ -177,7 +177,9 @@ module Mongo
|
|
177
177
|
begin
|
178
178
|
initial_query_op.execute(server.context)
|
179
179
|
rescue Mongo::Error::NeedPrimaryServer
|
180
|
-
|
180
|
+
log_warn([
|
181
|
+
'Rerouting the MapReduce operation to the primary server.'
|
182
|
+
])
|
181
183
|
server = ServerSelector.get(mode: :primary).select_server(cluster)
|
182
184
|
initial_query_op.execute(server.context)
|
183
185
|
end
|
@@ -32,10 +32,22 @@ module Mongo
|
|
32
32
|
:$comment => :comment,
|
33
33
|
:$snapshot => :snapshot,
|
34
34
|
:$maxScan => :max_scan,
|
35
|
+
:$maxTimeMS => :max_time_ms,
|
35
36
|
:$showDiskLoc => :show_disk_loc,
|
36
37
|
:$explain => :explained?
|
37
38
|
}.freeze
|
38
39
|
|
40
|
+
# Options to cursor flags mapping.
|
41
|
+
#
|
42
|
+
# @since 2.1.0
|
43
|
+
CURSOR_FLAGS_MAP = {
|
44
|
+
:allow_partial_results => [ :partial ],
|
45
|
+
:oplog_replay => [ :oplog_replay ],
|
46
|
+
:no_cursor_timeout => [ :no_cursor_timeout ],
|
47
|
+
:tailable => [ :tailable_cursor ],
|
48
|
+
:tailable_await => [ :await_data, :tailable_cursor]
|
49
|
+
}.freeze
|
50
|
+
|
39
51
|
# Execute an aggregation on the collection view.
|
40
52
|
#
|
41
53
|
# @example Aggregate documents.
|
@@ -53,6 +65,35 @@ module Mongo
|
|
53
65
|
Aggregation.new(self, pipeline, options)
|
54
66
|
end
|
55
67
|
|
68
|
+
# Execute a parallel scan on the collection view.
|
69
|
+
# Returns a list of up to cursor_count cursors that can be iterated concurrently.
|
70
|
+
# As long as the collection is not modified during scanning, each document appears once
|
71
|
+
# in one of the cursors' result sets.
|
72
|
+
#
|
73
|
+
# @example Execute a parallel collection scan.
|
74
|
+
# view.parallel_scan(2)
|
75
|
+
#
|
76
|
+
# @param [ Integer ] cursor_count The max number of cursors to return.
|
77
|
+
#
|
78
|
+
# @return [ Array<Cursor> ] An array of cursors.
|
79
|
+
#
|
80
|
+
# @since 2.1
|
81
|
+
def parallel_scan(cursor_count)
|
82
|
+
server = read.select_server(cluster)
|
83
|
+
Operation::ParallelScan.new(
|
84
|
+
:coll_name => collection.name,
|
85
|
+
:db_name => database.name,
|
86
|
+
:cursor_count => cursor_count
|
87
|
+
).execute(server.context).cursor_ids.map do |cursor_id|
|
88
|
+
result = Operation::Read::GetMore.new({ :to_return => 0,
|
89
|
+
:cursor_id => cursor_id,
|
90
|
+
:db_name => database.name,
|
91
|
+
:coll_name => collection.name
|
92
|
+
}).execute(server.context)
|
93
|
+
Cursor.new(self, result, server)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
56
97
|
# Allows the query to get partial results if some shards are down.
|
57
98
|
#
|
58
99
|
# @example Allow partial results.
|
@@ -111,6 +152,8 @@ module Mongo
|
|
111
152
|
# @option options :hint [ Hash ] Override default index selection and force
|
112
153
|
# MongoDB to use a specific index for the query.
|
113
154
|
# @option options :limit [ Integer ] Max number of docs to return.
|
155
|
+
# @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
|
156
|
+
# command to run.
|
114
157
|
# @option options :read [ Hash ] The read preference for this command.
|
115
158
|
#
|
116
159
|
# @return [ Integer ] The document count.
|
@@ -121,6 +164,7 @@ module Mongo
|
|
121
164
|
cmd[:skip] = options[:skip] if options[:skip]
|
122
165
|
cmd[:hint] = options[:hint] if options[:hint]
|
123
166
|
cmd[:limit] = options[:limit] if options[:limit]
|
167
|
+
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
124
168
|
database.command(cmd, options).n
|
125
169
|
end
|
126
170
|
|
@@ -132,18 +176,19 @@ module Mongo
|
|
132
176
|
# @param [ String, Symbol ] field_name The name of the field.
|
133
177
|
# @param [ Hash ] options Options for the distinct command.
|
134
178
|
#
|
179
|
+
# @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
|
180
|
+
# command to run.
|
135
181
|
# @option options :read [ Hash ] The read preference for this command.
|
136
182
|
#
|
137
183
|
# @return [ Array<Object> ] The list of distinct values.
|
138
184
|
#
|
139
185
|
# @since 2.0.0
|
140
186
|
def distinct(field_name, options={})
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
).documents.first['values']
|
187
|
+
cmd = { :distinct => collection.name,
|
188
|
+
:key => field_name.to_s,
|
189
|
+
:query => selector }
|
190
|
+
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
191
|
+
database.command(cmd, options).first['values']
|
147
192
|
end
|
148
193
|
|
149
194
|
# The index that MongoDB will be forced to use for the query.
|
@@ -249,7 +294,7 @@ module Mongo
|
|
249
294
|
# @since 2.0.0
|
250
295
|
def read(value = nil)
|
251
296
|
return default_read if value.nil?
|
252
|
-
configure(:read, value)
|
297
|
+
configure(:read, value.is_a?(Hash) ? ServerSelector.get(value) : value)
|
253
298
|
end
|
254
299
|
|
255
300
|
# Set whether the disk location should be shown for each document.
|
@@ -312,6 +357,34 @@ module Mongo
|
|
312
357
|
configure(:sort, spec)
|
313
358
|
end
|
314
359
|
|
360
|
+
# “meta” operators that let you modify the output or behavior of a query.
|
361
|
+
#
|
362
|
+
# @example Set the modifiers document.
|
363
|
+
# view.modifiers(:$orderby => Mongo::Index::ASCENDING)
|
364
|
+
#
|
365
|
+
# @param [ Hash ] doc The modifiers document.
|
366
|
+
#
|
367
|
+
# @return [ Hash, View ] Either the modifiers document or a new +View+.
|
368
|
+
#
|
369
|
+
# @since 2.1.0
|
370
|
+
def modifiers(doc = nil)
|
371
|
+
configure(:modifiers, doc)
|
372
|
+
end
|
373
|
+
|
374
|
+
# A cumulative time limit in milliseconds for processing operations on a cursor.
|
375
|
+
#
|
376
|
+
# @example Set the max time ms value.
|
377
|
+
# view.max_time_ms(500)
|
378
|
+
#
|
379
|
+
# @param [ Integer ] max The max time in milliseconds.
|
380
|
+
#
|
381
|
+
# @return [ Integer, View ] Either the max time ms value or a new +View+.
|
382
|
+
#
|
383
|
+
# @since 2.1.0
|
384
|
+
def max_time_ms(max = nil)
|
385
|
+
configure(:max_time_ms, max)
|
386
|
+
end
|
387
|
+
|
315
388
|
private
|
316
389
|
|
317
390
|
def default_read(read = nil)
|
@@ -319,15 +392,17 @@ module Mongo
|
|
319
392
|
end
|
320
393
|
|
321
394
|
def flags
|
322
|
-
@flags ||= (
|
395
|
+
@flags ||= CURSOR_FLAGS_MAP.each.reduce([]) do |flags, (key, value)|
|
396
|
+
if options[key] || (options[:cursor_type] && options[:cursor_type] == key)
|
397
|
+
flags.push(*value)
|
398
|
+
end
|
399
|
+
flags
|
400
|
+
end
|
323
401
|
end
|
324
402
|
|
325
403
|
def has_special_fields?
|
326
|
-
sort || hint || comment ||
|
327
|
-
|
328
|
-
|
329
|
-
def primary?
|
330
|
-
read.name == :primary
|
404
|
+
modifiers || sort || hint || comment || max_time_ms || max_scan ||
|
405
|
+
show_disk_loc || snapshot || explained? || cluster.sharded?
|
331
406
|
end
|
332
407
|
|
333
408
|
def query_options
|
@@ -349,7 +424,7 @@ module Mongo
|
|
349
424
|
|
350
425
|
def special_selector
|
351
426
|
SPECIAL_FIELDS.reduce({}) do |hash, (key, method)|
|
352
|
-
value = send(method)
|
427
|
+
value = send(method) || (options[:modifiers] && options[:modifiers][key])
|
353
428
|
hash[key] = value if value
|
354
429
|
hash
|
355
430
|
end
|
@@ -34,10 +34,11 @@ module Mongo
|
|
34
34
|
cmd = { :findandmodify => collection.name, :query => selector, :remove => true }
|
35
35
|
cmd[:fields] = projection if projection
|
36
36
|
cmd[:sort] = sort if sort
|
37
|
+
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
37
38
|
database.command(cmd).first['value']
|
38
39
|
end
|
39
40
|
|
40
|
-
# Finds a single document and
|
41
|
+
# Finds a single document and replaces it.
|
41
42
|
#
|
42
43
|
# @example Find a document and replace it, returning the original.
|
43
44
|
# view.find_one_and_replace({ name: 'test' }, :return_document => :before)
|
@@ -45,7 +46,7 @@ module Mongo
|
|
45
46
|
# @example Find a document and replace it, returning the new document.
|
46
47
|
# view.find_one_and_replace({ name: 'test' }, :return_document => :after)
|
47
48
|
#
|
48
|
-
# @param [ BSON::Document ] replacement The
|
49
|
+
# @param [ BSON::Document ] replacement The replacement.
|
49
50
|
# @param [ Hash ] opts The options.
|
50
51
|
#
|
51
52
|
# @option opts [ Symbol ] :return_document Either :before or :after.
|
@@ -79,6 +80,7 @@ module Mongo
|
|
79
80
|
cmd[:sort] = sort if sort
|
80
81
|
cmd[:new] = !!(opts[:return_document] && opts[:return_document] == :after)
|
81
82
|
cmd[:upsert] = opts[:upsert] if opts[:upsert]
|
83
|
+
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
82
84
|
value = database.command(cmd).first['value']
|
83
85
|
value unless value.nil? || value.empty?
|
84
86
|
end
|
@@ -112,7 +114,7 @@ module Mongo
|
|
112
114
|
# @example Replace a single document.
|
113
115
|
# collection_view.replace_one({ name: 'test' })
|
114
116
|
#
|
115
|
-
# @param [ Hash ]
|
117
|
+
# @param [ Hash ] replacement The replacement document.
|
116
118
|
# @param [ Hash ] opts The options.
|
117
119
|
#
|
118
120
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
@@ -121,14 +123,16 @@ module Mongo
|
|
121
123
|
# @return [ Result ] The response from the database.
|
122
124
|
#
|
123
125
|
# @since 2.0.0
|
124
|
-
def replace_one(
|
125
|
-
update(
|
126
|
+
def replace_one(replacement, opts = {})
|
127
|
+
update(replacement, false, opts)
|
126
128
|
end
|
127
129
|
|
128
130
|
# Update documents in the collection.
|
129
131
|
#
|
130
132
|
# @example Update multiple documents in the collection.
|
131
133
|
# collection_view.update_many('$set' => { name: 'test' })
|
134
|
+
#
|
135
|
+
# @param [ Hash ] spec The update statement.
|
132
136
|
# @param [ Hash ] opts The options.
|
133
137
|
#
|
134
138
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
@@ -145,6 +149,8 @@ module Mongo
|
|
145
149
|
#
|
146
150
|
# @example Update a single document in the collection.
|
147
151
|
# collection_view.update_one('$set' => { name: 'test' })
|
152
|
+
#
|
153
|
+
# @param [ Hash ] spec The update statement.
|
148
154
|
# @param [ Hash ] opts The options.
|
149
155
|
#
|
150
156
|
# @option opts [ true, false ] :upsert Whether to upsert if the
|
data/lib/mongo/cursor.rb
CHANGED
@@ -97,12 +97,16 @@ module Mongo
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def get_more_operation
|
100
|
-
Operation::Read::GetMore.new(
|
100
|
+
Operation::Read::GetMore.new(get_more_spec)
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_more_spec
|
104
|
+
{
|
101
105
|
:to_return => to_return,
|
102
106
|
:cursor_id => @cursor_id,
|
103
107
|
:db_name => database.name,
|
104
108
|
:coll_name => @coll_name || collection.name
|
105
|
-
}
|
109
|
+
}
|
106
110
|
end
|
107
111
|
|
108
112
|
def kill_cursors
|
@@ -110,7 +114,11 @@ module Mongo
|
|
110
114
|
end
|
111
115
|
|
112
116
|
def kill_cursors_operation
|
113
|
-
Operation::KillCursors.new(
|
117
|
+
Operation::KillCursors.new(kill_cursors_spec)
|
118
|
+
end
|
119
|
+
|
120
|
+
def kill_cursors_spec
|
121
|
+
{ :cursor_ids => [ @cursor_id ]}
|
114
122
|
end
|
115
123
|
|
116
124
|
def limited?
|
data/lib/mongo/dbref.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the 'License');
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an 'AS IS' BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
# Represents a DBRef document in the database.
|
18
|
+
#
|
19
|
+
# @since 2.1.0
|
20
|
+
class DBRef
|
21
|
+
include BSON::JSON
|
22
|
+
|
23
|
+
# The constant for the collection reference field.
|
24
|
+
#
|
25
|
+
# @since 2.1.0
|
26
|
+
COLLECTION = '$ref'.freeze
|
27
|
+
|
28
|
+
# The constant for the id field.
|
29
|
+
#
|
30
|
+
# @since 2.1.0
|
31
|
+
ID = '$id'.freeze
|
32
|
+
|
33
|
+
# The constant for the database field.
|
34
|
+
#
|
35
|
+
# @since 2.1.0
|
36
|
+
DATABASE = '$db'.freeze
|
37
|
+
|
38
|
+
# @return [ String ] collection The collection name.
|
39
|
+
attr_reader :collection
|
40
|
+
|
41
|
+
# @return [ BSON::ObjectId ] id The referenced document id.
|
42
|
+
attr_reader :id
|
43
|
+
|
44
|
+
# @return [ String ] database The database name.
|
45
|
+
attr_reader :database
|
46
|
+
|
47
|
+
# Get the DBRef as a JSON document
|
48
|
+
#
|
49
|
+
# @example Get the DBRef as a JSON hash.
|
50
|
+
# dbref.as_json
|
51
|
+
#
|
52
|
+
# @return [ Hash ] The max key as a JSON hash.
|
53
|
+
#
|
54
|
+
# @since 2.1.0
|
55
|
+
def as_json(*args)
|
56
|
+
document = { '$ref' => collection, '$id' => id }
|
57
|
+
document.merge!('$db' => database) if database
|
58
|
+
document
|
59
|
+
end
|
60
|
+
|
61
|
+
# Instantiate a new DBRef.
|
62
|
+
#
|
63
|
+
# @example Create the DBRef.
|
64
|
+
# Mongo::DBRef.new('users', id, 'database')
|
65
|
+
#
|
66
|
+
# @param [ String ] collection The collection name.
|
67
|
+
# @param [ BSON::ObjectId ] id The object id.
|
68
|
+
# @param [ String ] database The database name.
|
69
|
+
#
|
70
|
+
# @since 2.1.0
|
71
|
+
def initialize(collection, id, database = nil)
|
72
|
+
@collection = collection
|
73
|
+
@id = id
|
74
|
+
@database = database
|
75
|
+
end
|
76
|
+
|
77
|
+
# Converts the DBRef to raw BSON.
|
78
|
+
#
|
79
|
+
# @example Convert the DBRef to raw BSON.
|
80
|
+
# dbref.to_bson
|
81
|
+
#
|
82
|
+
# @param [ String ] encoded The encoded BSON to append to.
|
83
|
+
#
|
84
|
+
# @return [ String ] The raw BSON.
|
85
|
+
#
|
86
|
+
# @since 2.1.0
|
87
|
+
def to_bson(encoded = ''.force_encoding(BSON::BINARY))
|
88
|
+
as_json.to_bson(encoded)
|
89
|
+
end
|
90
|
+
|
91
|
+
module ClassMethods
|
92
|
+
|
93
|
+
# Deserialize the hash from BSON, converting to a DBRef if appropriate.
|
94
|
+
#
|
95
|
+
# @param [ IO ] bson The bson representing a hash.
|
96
|
+
#
|
97
|
+
# @return [ Hash, DBRef ] The decoded hash or DBRef.
|
98
|
+
#
|
99
|
+
# @see http://bsonspec.org/#/specification
|
100
|
+
#
|
101
|
+
# @since 2.0.0
|
102
|
+
def from_bson(bson)
|
103
|
+
decoded = super
|
104
|
+
if ref = decoded['$ref']
|
105
|
+
decoded = DBRef.new(ref, decoded['$id'], decoded['$db'])
|
106
|
+
end
|
107
|
+
decoded
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
::Hash.send(:extend, DBRef::ClassMethods)
|
113
|
+
end
|