mongo 2.1.2 → 2.2.0.rc0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +10 -3
- data/Rakefile +1 -7
- data/lib/csasl/csasl.bundle +0 -0
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/bulk_write.rb +7 -1
- data/lib/mongo/client.rb +17 -15
- data/lib/mongo/cluster.rb +4 -2
- data/lib/mongo/collection.rb +36 -2
- data/lib/mongo/collection/view.rb +24 -21
- data/lib/mongo/collection/view/aggregation.rb +5 -42
- data/lib/mongo/collection/view/builder.rb +20 -0
- data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
- data/lib/mongo/collection/view/builder/find_command.rb +111 -0
- data/lib/mongo/collection/view/builder/flags.rb +62 -0
- data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
- data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
- data/lib/mongo/collection/view/builder/op_query.rb +83 -0
- data/lib/mongo/collection/view/explainable.rb +15 -0
- data/lib/mongo/collection/view/immutable.rb +5 -12
- data/lib/mongo/collection/view/iterable.rb +24 -2
- data/lib/mongo/collection/view/map_reduce.rb +18 -27
- data/lib/mongo/collection/view/readable.rb +70 -112
- data/lib/mongo/collection/view/writable.rb +23 -7
- data/lib/mongo/cursor.rb +76 -25
- data/lib/mongo/cursor/builder.rb +18 -0
- data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
- data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
- data/lib/mongo/database.rb +2 -2
- data/lib/mongo/database/view.rb +9 -5
- data/lib/mongo/dbref.rb +3 -3
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/invalid_write_concern.rb +35 -0
- data/lib/mongo/grid/file/chunk.rb +2 -2
- data/lib/mongo/index/view.rb +5 -2
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/commands.rb +2 -0
- data/lib/mongo/operation/commands/aggregate.rb +39 -45
- data/lib/mongo/operation/commands/aggregate/result.rb +54 -68
- data/lib/mongo/operation/commands/collections_info.rb +38 -36
- data/lib/mongo/operation/commands/collections_info/result.rb +17 -15
- data/lib/mongo/operation/commands/command.rb +24 -22
- data/lib/mongo/operation/commands/find.rb +27 -0
- data/lib/mongo/operation/commands/find/result.rb +62 -0
- data/lib/mongo/operation/commands/get_more.rb +27 -0
- data/lib/mongo/operation/commands/get_more/result.rb +62 -0
- data/lib/mongo/operation/commands/indexes.rb +41 -39
- data/lib/mongo/operation/commands/list_collections.rb +25 -31
- data/lib/mongo/operation/commands/list_collections/result.rb +63 -81
- data/lib/mongo/operation/commands/list_indexes.rb +27 -35
- data/lib/mongo/operation/commands/list_indexes/result.rb +67 -85
- data/lib/mongo/operation/commands/map_reduce.rb +29 -37
- data/lib/mongo/operation/commands/map_reduce/result.rb +85 -88
- data/lib/mongo/operation/commands/parallel_scan.rb +29 -33
- data/lib/mongo/operation/commands/parallel_scan/result.rb +34 -42
- data/lib/mongo/operation/commands/user_query.rb +40 -38
- data/lib/mongo/operation/commands/users_info.rb +24 -29
- data/lib/mongo/operation/commands/users_info/result.rb +13 -11
- data/lib/mongo/operation/object_id_generator.rb +36 -0
- data/lib/mongo/operation/result.rb +30 -0
- data/lib/mongo/operation/specifiable.rb +35 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -3
- data/lib/mongo/operation/write/bulk/delete/result.rb +18 -25
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +2 -2
- data/lib/mongo/operation/write/command/delete.rb +3 -2
- data/lib/mongo/operation/write/command/insert.rb +4 -2
- data/lib/mongo/operation/write/command/update.rb +6 -3
- data/lib/mongo/operation/write/gle.rb +2 -1
- data/lib/mongo/operation/write/idable.rb +19 -2
- data/lib/mongo/options/mapper.rb +22 -0
- data/lib/mongo/protocol/bit_vector.rb +3 -3
- data/lib/mongo/protocol/delete.rb +15 -5
- data/lib/mongo/protocol/get_more.rb +10 -5
- data/lib/mongo/protocol/insert.rb +1 -6
- data/lib/mongo/protocol/kill_cursors.rb +14 -1
- data/lib/mongo/protocol/message.rb +32 -8
- data/lib/mongo/protocol/serializers.rb +15 -16
- data/lib/mongo/protocol/update.rb +35 -12
- data/lib/mongo/server/connectable.rb +3 -1
- data/lib/mongo/server/connection.rb +5 -5
- data/lib/mongo/server/description.rb +8 -2
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/monitor.rb +1 -12
- data/lib/mongo/server/monitor/connection.rb +30 -26
- data/lib/mongo/server_selector/selectable.rb +21 -4
- data/lib/mongo/uri.rb +2 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +21 -6
- data/mongo.gemspec +1 -2
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +13 -0
- data/spec/mongo/bulk_write_spec.rb +58 -0
- data/spec/mongo/client_spec.rb +6 -4
- data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
- data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
- data/spec/mongo/collection/view/explainable_spec.rb +1 -2
- data/spec/mongo/collection/view/immutable_spec.rb +3 -52
- data/spec/mongo/collection/view/map_reduce_spec.rb +12 -12
- data/spec/mongo/collection/view/readable_spec.rb +86 -80
- data/spec/mongo/collection/view_spec.rb +109 -703
- data/spec/mongo/collection_spec.rb +594 -11
- data/spec/mongo/command_monitoring_spec.rb +40 -27
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
- data/spec/mongo/cursor_spec.rb +10 -60
- data/spec/mongo/database_spec.rb +24 -3
- data/spec/mongo/dbref_spec.rb +4 -4
- data/spec/mongo/grid/file/chunk_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +3 -3
- data/spec/mongo/index/view_spec.rb +41 -0
- data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
- data/spec/mongo/operation/commands/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/commands/command_spec.rb +1 -1
- data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
- data/spec/mongo/operation/commands/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/write/command/delete_spec.rb +25 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +25 -0
- data/spec/mongo/operation/write/command/update_spec.rb +25 -0
- data/spec/mongo/protocol/delete_spec.rb +4 -4
- data/spec/mongo/protocol/get_more_spec.rb +4 -4
- data/spec/mongo/protocol/insert_spec.rb +3 -3
- data/spec/mongo/protocol/kill_cursors_spec.rb +3 -3
- data/spec/mongo/protocol/query_spec.rb +7 -7
- data/spec/mongo/protocol/update_spec.rb +5 -5
- data/spec/mongo/server/description/features_spec.rb +25 -0
- data/spec/mongo/write_concern_spec.rb +126 -0
- data/spec/spec_helper.rb +9 -19
- data/spec/support/command_monitoring.rb +8 -0
- data/spec/support/command_monitoring/find.yml +53 -4
- data/spec/support/matchers.rb +1 -1
- data/spec/support/shared/protocol.rb +5 -5
- data/spec/support/travis.rb +1 -1
- metadata +43 -10
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcc9c2c71373a6cf0c7ecc20e34dc665a3609113
|
4
|
+
data.tar.gz: b0586f936825521d4d1b720aaab115094c754b52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bd095acd88b753375c7b32441645a7f79bd6e79fa66c4b49d1d16f98a17a3ebb88628132d863dee8a49132b0ad06cd540fc329b37d3250e1793ecf0ce0fbb55
|
7
|
+
data.tar.gz: 8081fad549d197c92f9b573694b32a1813030fcde279e98ab117dd9d4b601b5bb2139a720c218b03fadd3315a8a9f391066f7ad96c99f194ce1cf186b6a56673
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![
|
1
|
+
MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![Gem Version][rubygems-img]][rubygems-url]
|
2
2
|
-----
|
3
3
|
The officially supported Ruby driver for [MongoDB](http://www.mongodb.org).
|
4
4
|
|
@@ -40,6 +40,15 @@ When reporting an issue, please keep in mind that all information in JIRA for al
|
|
40
40
|
* Provide any sensitive data or server logs.
|
41
41
|
* Report potential security issues publicly (see 'Security Issues').
|
42
42
|
|
43
|
+
Running Tests
|
44
|
+
-----
|
45
|
+
|
46
|
+
The driver uses RSpec as it's primary testing tool. To run all tests simple run `rspec`.
|
47
|
+
|
48
|
+
To run a test at a specific location (where `42` is the line number), use:
|
49
|
+
|
50
|
+
rspec path/to/spec.rb:42
|
51
|
+
|
43
52
|
Security Issues
|
44
53
|
-----
|
45
54
|
|
@@ -74,5 +83,3 @@ License
|
|
74
83
|
[travis-url]: http://travis-ci.org/mongodb/mongo-ruby-driver?branch=master
|
75
84
|
[codeclimate-img]: https://codeclimate.com/github/mongodb/mongo-ruby-driver.png?branch=master
|
76
85
|
[codeclimate-url]: https://codeclimate.com/github/mongodb/mongo-ruby-driver?branch=master
|
77
|
-
[coveralls-img]: https://coveralls.io/repos/mongodb/mongo-ruby-driver/badge.png?branch=master
|
78
|
-
[coveralls-url]: https://coveralls.io/r/mongodb/mongo-ruby-driver?branch=master
|
data/Rakefile
CHANGED
@@ -19,13 +19,7 @@ RSpec::Core::RakeTask.new(:spec)
|
|
19
19
|
task :default => :spec
|
20
20
|
|
21
21
|
namespace :spec do
|
22
|
-
|
23
|
-
require 'coveralls/rake/task'
|
24
|
-
Coveralls::RakeTask.new
|
25
|
-
task :ci => [:spec, 'coveralls:push']
|
26
|
-
else
|
27
|
-
task :ci => [:spec]
|
28
|
-
end
|
22
|
+
task :ci => [:spec]
|
29
23
|
end
|
30
24
|
|
31
25
|
task :release => :spec do
|
Binary file
|
data/lib/mongo/auth/user/view.rb
CHANGED
data/lib/mongo/bulk_write.rb
CHANGED
@@ -37,6 +37,8 @@ module Mongo
|
|
37
37
|
# Delegate various methods to the collection.
|
38
38
|
def_delegators :@collection, :database, :cluster, :next_primary
|
39
39
|
|
40
|
+
def_delegators :database, :client
|
41
|
+
|
40
42
|
# Execute the bulk write operation.
|
41
43
|
#
|
42
44
|
# @example Execute the bulk write.
|
@@ -131,7 +133,10 @@ module Mongo
|
|
131
133
|
:coll_name => collection.name,
|
132
134
|
:write_concern => write_concern,
|
133
135
|
:ordered => ordered?,
|
134
|
-
:operation_id => operation_id
|
136
|
+
:operation_id => operation_id,
|
137
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
138
|
+
:options => options,
|
139
|
+
:id_generator => client.options[:id_generator]
|
135
140
|
}
|
136
141
|
end
|
137
142
|
|
@@ -143,6 +148,7 @@ module Mongo
|
|
143
148
|
combiner.combine!(send(name, values, server, operation_id), values.size)
|
144
149
|
end
|
145
150
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
151
|
+
raise e if values.size <= 1
|
146
152
|
split_execute(name, values, server, operation_id, combiner)
|
147
153
|
end
|
148
154
|
end
|
data/lib/mongo/client.rb
CHANGED
@@ -33,33 +33,35 @@ module Mongo
|
|
33
33
|
# @since 2.1.2
|
34
34
|
VALID_OPTIONS = [
|
35
35
|
:auth_mech,
|
36
|
+
:auth_mech_properties,
|
36
37
|
:auth_source,
|
37
38
|
:connect,
|
39
|
+
:connect_timeout,
|
38
40
|
:database,
|
39
|
-
:auth_mech_properties,
|
40
41
|
:heartbeat_frequency,
|
42
|
+
:id_generator,
|
41
43
|
:local_threshold,
|
42
|
-
:
|
43
|
-
:password,
|
44
|
+
:logger,
|
44
45
|
:max_pool_size,
|
46
|
+
:max_read_retries,
|
45
47
|
:min_pool_size,
|
46
|
-
:
|
47
|
-
:
|
48
|
+
:monitoring,
|
49
|
+
:password,
|
48
50
|
:read,
|
49
|
-
:
|
51
|
+
:read_retry_interval,
|
50
52
|
:replica_set,
|
53
|
+
:server_selection_timeout,
|
54
|
+
:socket_timeout,
|
51
55
|
:ssl,
|
56
|
+
:ssl_ca_cert,
|
52
57
|
:ssl_cert,
|
53
58
|
:ssl_key,
|
54
59
|
:ssl_key_pass_phrase,
|
55
60
|
:ssl_verify,
|
56
|
-
:
|
57
|
-
:socket_timeout,
|
61
|
+
:truncate_logs,
|
58
62
|
:user,
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:logger,
|
62
|
-
:truncate_logs
|
63
|
+
:wait_queue_timeout,
|
64
|
+
:write
|
63
65
|
].freeze
|
64
66
|
|
65
67
|
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
@@ -160,8 +162,6 @@ module Mongo
|
|
160
162
|
# and local_threshold.
|
161
163
|
# :mode can be one of :secondary, :secondary_preferred, :primary,
|
162
164
|
# :primary_preferred, :nearest.
|
163
|
-
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
164
|
-
# user.
|
165
165
|
# @option options [ Symbol ] :replica_set The name of the replica set to
|
166
166
|
# connect to. Servers not in this replica set will be ignored.
|
167
167
|
# @option options [ true, false ] :ssl Whether to use SSL.
|
@@ -180,7 +180,7 @@ module Mongo
|
|
180
180
|
# execute operations on a socket.
|
181
181
|
# @option options [ String ] :user The user name.
|
182
182
|
# @option options [ Hash ] :write The write concern options. Can be :w =>
|
183
|
-
# Integer, :fsync => Boolean, :j => Boolean.
|
183
|
+
# Integer|String, :fsync => Boolean, :j => Boolean.
|
184
184
|
# @option options [ true, false ] :monitoring Initializes a client without
|
185
185
|
# any default monitoring if false is provided.
|
186
186
|
# @option options [ Logger ] :logger A custom logger if desired.
|
@@ -190,6 +190,8 @@ module Mongo
|
|
190
190
|
# retries on mongos query failures.
|
191
191
|
# @option options [ Float ] :read_retry_interval The interval, in seconds,
|
192
192
|
# in which reads on a mongos are retried.
|
193
|
+
# @option options [ Object ] :id_generator A custom object to generate ids
|
194
|
+
# for documents. Must respond to #generate.
|
193
195
|
#
|
194
196
|
# @since 2.0.0
|
195
197
|
def initialize(addresses_or_uri, options = Options::Redacted.new)
|
data/lib/mongo/cluster.rb
CHANGED
@@ -131,11 +131,13 @@ module Mongo
|
|
131
131
|
# @example Get the next primary server.
|
132
132
|
# cluster.next_primary
|
133
133
|
#
|
134
|
+
# @param [ true, false ] ping Whether to ping the server before selection.
|
135
|
+
#
|
134
136
|
# @return [ Mongo::Server ] A primary server.
|
135
137
|
#
|
136
138
|
# @since 2.0.0
|
137
|
-
def next_primary
|
138
|
-
ServerSelector.get(ServerSelector::PRIMARY.merge(options)).select_server(self)
|
139
|
+
def next_primary(ping = true)
|
140
|
+
ServerSelector.get(ServerSelector::PRIMARY.merge(options)).select_server(self, ping)
|
139
141
|
end
|
140
142
|
|
141
143
|
# Elect a primary server from the description that has just changed to a
|
data/lib/mongo/collection.rb
CHANGED
@@ -56,7 +56,7 @@ module Mongo
|
|
56
56
|
# Options that can be updated on a new Collection instance via the #with method.
|
57
57
|
#
|
58
58
|
# @since 2.1.0
|
59
|
-
CHANGEABLE_OPTIONS = [ :read, :write ]
|
59
|
+
CHANGEABLE_OPTIONS = [ :read, :read_concern, :write ].freeze
|
60
60
|
|
61
61
|
# Check if a collection is equal to another object. Will check the name and
|
62
62
|
# the database for equality.
|
@@ -91,6 +91,18 @@ module Mongo
|
|
91
91
|
@options = options.freeze
|
92
92
|
end
|
93
93
|
|
94
|
+
# Get the read concern for this collection instance.
|
95
|
+
#
|
96
|
+
# @example Get the read concern.
|
97
|
+
# collection.read_concern
|
98
|
+
#
|
99
|
+
# @return [ Hash ] The read concern.
|
100
|
+
#
|
101
|
+
# @since 2.2.0
|
102
|
+
def read_concern
|
103
|
+
@read_concern ||= options[:read_concern]
|
104
|
+
end
|
105
|
+
|
94
106
|
# Get the read preference on this collection.
|
95
107
|
#
|
96
108
|
# @example Get the read preference.
|
@@ -235,6 +247,8 @@ module Mongo
|
|
235
247
|
# aggregation to run.
|
236
248
|
# @option options [ true, false ] :use_cursor Indicates whether the command will request that the server
|
237
249
|
# provide results using a cursor.
|
250
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
251
|
+
# not to skip document level validation.
|
238
252
|
#
|
239
253
|
# @return [ Aggregation ] The aggregation object.
|
240
254
|
#
|
@@ -326,7 +340,9 @@ module Mongo
|
|
326
340
|
:db_name => database.name,
|
327
341
|
:coll_name => name,
|
328
342
|
:write_concern => write_concern,
|
329
|
-
:
|
343
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
344
|
+
:options => options,
|
345
|
+
:id_generator => client.options[:id_generator]
|
330
346
|
).execute(next_primary.context)
|
331
347
|
end
|
332
348
|
end
|
@@ -359,6 +375,8 @@ module Mongo
|
|
359
375
|
# should be executed in order.
|
360
376
|
# @option options [ Hash ] :write_concern The write concern options.
|
361
377
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
378
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
379
|
+
# not to skip document level validation.
|
362
380
|
#
|
363
381
|
# @return [ BulkWrite::Result ] The result of the operation.
|
364
382
|
#
|
@@ -424,6 +442,8 @@ module Mongo
|
|
424
442
|
#
|
425
443
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
426
444
|
# document doesn't exist.
|
445
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
446
|
+
# not to skip document level validation.
|
427
447
|
#
|
428
448
|
# @return [ Result ] The response from the database.
|
429
449
|
#
|
@@ -443,6 +463,8 @@ module Mongo
|
|
443
463
|
#
|
444
464
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
445
465
|
# document doesn't exist.
|
466
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
467
|
+
# not to skip document level validation.
|
446
468
|
#
|
447
469
|
# @return [ Result ] The response from the database.
|
448
470
|
#
|
@@ -462,6 +484,8 @@ module Mongo
|
|
462
484
|
#
|
463
485
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
464
486
|
# document doesn't exist.
|
487
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
488
|
+
# not to skip document level validation.
|
465
489
|
#
|
466
490
|
# @return [ Result ] The response from the database.
|
467
491
|
#
|
@@ -484,6 +508,8 @@ module Mongo
|
|
484
508
|
# @option options [ Hash ] :projection The fields to include or exclude in the returned doc.
|
485
509
|
# @option options [ Hash ] :sort The key and direction pairs by which the result set
|
486
510
|
# will be sorted.
|
511
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
512
|
+
# Defaults to the collection's write concern.
|
487
513
|
#
|
488
514
|
# @return [ BSON::Document, nil ] The document, if found.
|
489
515
|
#
|
@@ -512,6 +538,10 @@ module Mongo
|
|
512
538
|
# will be sorted.
|
513
539
|
# @option options [ Symbol ] :return_document Either :before or :after.
|
514
540
|
# @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
541
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
542
|
+
# not to skip document level validation.
|
543
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
544
|
+
# Defaults to the collection's write concern.
|
515
545
|
#
|
516
546
|
# @return [ BSON::Document ] The document.
|
517
547
|
#
|
@@ -540,6 +570,10 @@ module Mongo
|
|
540
570
|
# will be sorted.
|
541
571
|
# @option options [ Symbol ] :return_document Either :before or :after.
|
542
572
|
# @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
573
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
574
|
+
# not to skip document level validation.
|
575
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
576
|
+
# Defaults to the collection's write concern.
|
543
577
|
#
|
544
578
|
# @return [ BSON::Document ] The document.
|
545
579
|
#
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'mongo/collection/view/builder'
|
15
16
|
require 'mongo/collection/view/immutable'
|
16
17
|
require 'mongo/collection/view/iterable'
|
17
18
|
require 'mongo/collection/view/explainable'
|
@@ -48,10 +49,11 @@ module Mongo
|
|
48
49
|
include Explainable
|
49
50
|
include Writable
|
50
51
|
|
51
|
-
# @return [
|
52
|
+
# @return [ Collection ] The +Collection+ to query.
|
52
53
|
attr_reader :collection
|
53
|
-
|
54
|
-
|
54
|
+
|
55
|
+
# @return [ Hash ] The query filter.
|
56
|
+
attr_reader :filter
|
55
57
|
|
56
58
|
# Delegate necessary operations to the collection.
|
57
59
|
def_delegators :collection, :client, :cluster, :database, :read_preference, :write_concern
|
@@ -59,25 +61,27 @@ module Mongo
|
|
59
61
|
# Delegate to the cluster for the next primary.
|
60
62
|
def_delegators :cluster, :next_primary
|
61
63
|
|
64
|
+
alias :selector :filter
|
65
|
+
|
62
66
|
# Compare two +View+ objects.
|
63
67
|
#
|
64
68
|
# @example Compare the view with another object.
|
65
69
|
# view == other
|
66
70
|
#
|
67
|
-
# @return [ true, false ] Equal if collection,
|
71
|
+
# @return [ true, false ] Equal if collection, filter, and options of two
|
68
72
|
# +View+ match.
|
69
73
|
#
|
70
74
|
# @since 2.0.0
|
71
75
|
def ==(other)
|
72
76
|
return false unless other.is_a?(View)
|
73
77
|
collection == other.collection &&
|
74
|
-
|
78
|
+
filter == other.filter &&
|
75
79
|
options == other.options
|
76
80
|
end
|
77
81
|
alias_method :eql?, :==
|
78
82
|
|
79
83
|
# A hash value for the +View+ composed of the collection namespace,
|
80
|
-
# hash of the options and hash of the
|
84
|
+
# hash of the options and hash of the filter.
|
81
85
|
#
|
82
86
|
# @example Get the hash value.
|
83
87
|
# view.hash
|
@@ -86,7 +90,7 @@ module Mongo
|
|
86
90
|
#
|
87
91
|
# @since 2.0.0
|
88
92
|
def hash
|
89
|
-
[ collection.namespace, options.hash,
|
93
|
+
[ collection.namespace, options.hash, filter.hash ].hash
|
90
94
|
end
|
91
95
|
|
92
96
|
# Creates a new +View+.
|
@@ -101,7 +105,7 @@ module Mongo
|
|
101
105
|
# View.new(collection, {:name => 'Emily'}, :read => :secondary_preferred)
|
102
106
|
#
|
103
107
|
# @param [ Collection ] collection The +Collection+ to query.
|
104
|
-
# @param [ Hash ]
|
108
|
+
# @param [ Hash ] filter The query filter.
|
105
109
|
# @param [ Hash ] options The additional query options.
|
106
110
|
#
|
107
111
|
# @option options :comment [ String ] Associate a comment with the query.
|
@@ -125,10 +129,10 @@ module Mongo
|
|
125
129
|
# results.
|
126
130
|
#
|
127
131
|
# @since 2.0.0
|
128
|
-
def initialize(collection,
|
129
|
-
validate_doc!(
|
132
|
+
def initialize(collection, filter = {}, options = {})
|
133
|
+
validate_doc!(filter)
|
130
134
|
@collection = collection
|
131
|
-
|
135
|
+
parse_parameters!(BSON::Document.new(filter.freeze), BSON::Document.new(options.freeze))
|
132
136
|
end
|
133
137
|
|
134
138
|
# Get a human-readable string representation of +View+.
|
@@ -140,8 +144,8 @@ module Mongo
|
|
140
144
|
#
|
141
145
|
# @since 2.0.0
|
142
146
|
def inspect
|
143
|
-
"#<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}" +
|
144
|
-
" @
|
147
|
+
"#<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}'" +
|
148
|
+
" @filter=#{filter.to_s} @options=#{options.to_s}>"
|
145
149
|
end
|
146
150
|
|
147
151
|
private
|
@@ -149,19 +153,18 @@ module Mongo
|
|
149
153
|
def initialize_copy(other)
|
150
154
|
@collection = other.collection
|
151
155
|
@options = other.options.dup
|
152
|
-
@
|
156
|
+
@filter = other.filter.dup
|
153
157
|
end
|
154
158
|
|
155
|
-
def
|
156
|
-
|
159
|
+
def parse_parameters!(filter, options)
|
160
|
+
query = filter.delete(QUERY)
|
161
|
+
modifiers = (filter || {}).merge(options.delete(MODIFIERS) || {})
|
162
|
+
@filter = query || filter
|
163
|
+
@options = Builder::Modifiers.map_driver_options(modifiers).merge!(options)
|
157
164
|
end
|
158
165
|
|
159
166
|
def new(options)
|
160
|
-
View.new(collection,
|
161
|
-
end
|
162
|
-
|
163
|
-
def send_initial_query(server)
|
164
|
-
initial_query_op.execute(server.context)
|
167
|
+
View.new(collection, filter, options)
|
165
168
|
end
|
166
169
|
|
167
170
|
def view; self; end
|
@@ -39,15 +39,6 @@ module Mongo
|
|
39
39
|
# Delegate necessary operations to the collection.
|
40
40
|
def_delegators :collection, :database
|
41
41
|
|
42
|
-
# Options mapping for an aggregation.
|
43
|
-
#
|
44
|
-
# @since 2.1.0
|
45
|
-
OPTIONS_MAP = {
|
46
|
-
:allow_disk_use => :allowDiskUse,
|
47
|
-
:max_time_ms => :maxTimeMS,
|
48
|
-
:explain => :explain
|
49
|
-
}.freeze
|
50
|
-
|
51
42
|
# The reroute message.
|
52
43
|
#
|
53
44
|
# @since 2.1.0
|
@@ -65,7 +56,7 @@ module Mongo
|
|
65
56
|
#
|
66
57
|
# @since 2.0.0
|
67
58
|
def allow_disk_use(value = nil)
|
68
|
-
configure(
|
59
|
+
configure(:allow_disk_use, value)
|
69
60
|
end
|
70
61
|
|
71
62
|
# Initialize the aggregation for the provided collection view, pipeline
|
@@ -94,41 +85,13 @@ module Mongo
|
|
94
85
|
#
|
95
86
|
# @since 2.0.0
|
96
87
|
def explain
|
97
|
-
self.class.new(view, pipeline, options.merge(
|
88
|
+
self.class.new(view, pipeline, options.merge(explain: true)).first
|
98
89
|
end
|
99
90
|
|
100
91
|
private
|
101
92
|
|
102
93
|
def aggregate_spec
|
103
|
-
|
104
|
-
:read => read,
|
105
|
-
:selector => {
|
106
|
-
:aggregate => collection.name,
|
107
|
-
:pipeline => pipeline,
|
108
|
-
:cursor => cursor,
|
109
|
-
}.merge!(agg_options)
|
110
|
-
}
|
111
|
-
end
|
112
|
-
|
113
|
-
def agg_options
|
114
|
-
@agg_options ||= options.each.reduce({}) do |opts, (key, value)|
|
115
|
-
OPTIONS_MAP[key] ? opts.merge!(OPTIONS_MAP[key] => value) : opts
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def cursor
|
120
|
-
if options[:use_cursor] == true || options[:use_cursor].nil?
|
121
|
-
batch_size_doc
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def batch_size_doc
|
126
|
-
(value = options[:batch_size] || view.batch_size) ?
|
127
|
-
{ :batchSize => value } : {}
|
128
|
-
end
|
129
|
-
|
130
|
-
def explain_options
|
131
|
-
{ :explain => true }
|
94
|
+
Builder::Aggregation.new(pipeline, view, options).specification
|
132
95
|
end
|
133
96
|
|
134
97
|
def new(options)
|
@@ -136,7 +99,7 @@ module Mongo
|
|
136
99
|
end
|
137
100
|
|
138
101
|
def initial_query_op
|
139
|
-
Operation::Aggregate.new(aggregate_spec)
|
102
|
+
Operation::Commands::Aggregate.new(aggregate_spec)
|
140
103
|
end
|
141
104
|
|
142
105
|
def valid_server?(server)
|
@@ -150,7 +113,7 @@ module Mongo
|
|
150
113
|
def send_initial_query(server)
|
151
114
|
unless valid_server?(server)
|
152
115
|
log_warn(REROUTE)
|
153
|
-
server = cluster.next_primary
|
116
|
+
server = cluster.next_primary(false)
|
154
117
|
end
|
155
118
|
initial_query_op.execute(server.context)
|
156
119
|
end
|