mongo 2.1.0.beta → 2.2.0
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/README.md +10 -3
- data/Rakefile +1 -7
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +32 -10
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +7 -3
- data/lib/mongo/auth/scram/conversation.rb +9 -3
- data/lib/mongo/auth/user/view.rb +23 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +61 -8
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +132 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/bulk_write.rb +164 -23
- data/lib/mongo/client.rb +75 -18
- data/lib/mongo/cluster/topology/replica_set.rb +8 -6
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +85 -5
- data/lib/mongo/collection/view/aggregation.rb +19 -45
- 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/builder.rb +20 -0
- data/lib/mongo/collection/view/explainable.rb +15 -0
- data/lib/mongo/collection/view/immutable.rb +4 -11
- data/lib/mongo/collection/view/iterable.rb +40 -5
- data/lib/mongo/collection/view/map_reduce.rb +67 -37
- data/lib/mongo/collection/view/readable.rb +114 -100
- data/lib/mongo/collection/view/writable.rb +46 -22
- data/lib/mongo/collection/view.rb +25 -22
- data/lib/mongo/collection.rb +130 -12
- 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/cursor/builder.rb +18 -0
- data/lib/mongo/cursor.rb +76 -21
- data/lib/mongo/database/view.rb +11 -6
- data/lib/mongo/database.rb +16 -6
- data/lib/mongo/dbref.rb +9 -9
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
- data/lib/mongo/error/file_not_found.rb +37 -0
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/invalid_write_concern.rb +35 -0
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +33 -2
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/error.rb +8 -0
- data/lib/mongo/grid/file/chunk.rb +9 -9
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +12 -9
- data/lib/mongo/grid/fs_bucket.rb +448 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/index/view.rb +7 -4
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/publishable.rb +22 -12
- data/lib/mongo/monitoring.rb +1 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
- data/lib/mongo/operation/commands/aggregate.rb +64 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
- data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
- data/lib/mongo/operation/commands/command.rb +47 -0
- data/lib/mongo/operation/commands/find/result.rb +62 -0
- data/lib/mongo/operation/commands/find.rb +27 -0
- data/lib/mongo/operation/commands/get_more/result.rb +62 -0
- data/lib/mongo/operation/commands/get_more.rb +27 -0
- data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
- data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
- data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
- data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
- data/lib/mongo/operation/commands/map_reduce.rb +49 -0
- data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
- data/lib/mongo/operation/commands/user_query.rb +71 -0
- data/lib/mongo/operation/commands/users_info/result.rb +38 -0
- data/lib/mongo/operation/commands/users_info.rb +48 -0
- data/lib/mongo/operation/commands.rb +26 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/object_id_generator.rb +36 -0
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/operation/read/query/result.rb +40 -0
- data/lib/mongo/operation/read/query.rb +4 -21
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/result.rb +43 -1
- data/lib/mongo/operation/specifiable.rb +59 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +3 -3
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +4 -3
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +6 -4
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +6 -29
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +49 -0
- data/lib/mongo/operation/write/idable.rb +24 -2
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +13 -36
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation.rb +33 -5
- data/lib/mongo/options/mapper.rb +26 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/bit_vector.rb +11 -9
- data/lib/mongo/protocol/delete.rb +78 -3
- data/lib/mongo/protocol/get_more.rb +59 -2
- data/lib/mongo/protocol/insert.rb +73 -1
- data/lib/mongo/protocol/kill_cursors.rb +66 -4
- data/lib/mongo/protocol/message.rb +44 -20
- data/lib/mongo/protocol/query.rb +153 -65
- data/lib/mongo/protocol/reply.rb +92 -1
- data/lib/mongo/protocol/serializers.rb +49 -40
- data/lib/mongo/protocol/update.rb +93 -1
- data/lib/mongo/retryable.rb +101 -0
- data/lib/mongo/server/connectable.rb +28 -8
- data/lib/mongo/server/connection.rb +52 -10
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -15
- data/lib/mongo/server/description/features.rb +4 -2
- data/lib/mongo/server/description.rb +39 -3
- data/lib/mongo/server/monitor/connection.rb +49 -28
- data/lib/mongo/server/monitor.rb +3 -14
- data/lib/mongo/server.rb +31 -4
- data/lib/mongo/server_selector/selectable.rb +58 -32
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +4 -1
- data/lib/mongo/socket/tcp.rb +2 -2
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +245 -139
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +21 -6
- data/lib/mongo.rb +4 -4
- data/mongo.gemspec +1 -2
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +385 -161
- data/spec/mongo/client_spec.rb +193 -23
- data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
- 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 +54 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
- data/spec/mongo/collection/view/readable_spec.rb +109 -112
- data/spec/mongo/collection/view_spec.rb +119 -487
- data/spec/mongo/collection_spec.rb +1002 -33
- data/spec/mongo/command_monitoring_spec.rb +64 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- 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 +81 -12
- data/spec/mongo/dbref_spec.rb +4 -4
- data/spec/mongo/grid/file/chunk_spec.rb +6 -6
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/index/view_spec.rb +41 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
- data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/result_spec.rb +19 -0
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
- data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
- data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
- data/spec/mongo/operation/write/command/update_spec.rb +18 -9
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/insert_spec.rb +0 -11
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -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 +8 -6
- data/spec/mongo/protocol/query_spec.rb +21 -7
- data/spec/mongo/protocol/update_spec.rb +5 -5
- data/spec/mongo/retryable_spec.rb +221 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +42 -6
- data/spec/mongo/server/connection_spec.rb +86 -1
- data/spec/mongo/server/description/features_spec.rb +25 -0
- data/spec/mongo/server/description_spec.rb +42 -0
- data/spec/mongo/server/monitor_spec.rb +44 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +35 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
- data/spec/mongo/server_selector/primary_spec.rb +21 -14
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
- data/spec/mongo/server_selector/secondary_spec.rb +24 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/server_spec.rb +78 -15
- data/spec/mongo/socket/ssl_spec.rb +101 -57
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +271 -59
- data/spec/mongo/write_concern_spec.rb +126 -0
- data/spec/spec_helper.rb +29 -23
- data/spec/support/authorization.rb +4 -5
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +268 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/command_monitoring.rb +373 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud/read.rb +14 -10
- data/spec/support/crud/write.rb +36 -9
- data/spec/support/crud.rb +10 -2
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/matchers.rb +2 -2
- data/spec/support/sdam/rs/equal_electionids.yml +1 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
- 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/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +3 -1
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +192 -0
- data/spec/support/shared/protocol.rb +5 -5
- data/spec/support/shared/server_selector.rb +78 -13
- data/spec/support/travis.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +211 -72
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
- data/lib/mongo/bulk_write/deletable.rb +0 -57
- data/lib/mongo/bulk_write/insertable.rb +0 -49
- data/lib/mongo/bulk_write/replacable.rb +0 -58
- data/lib/mongo/bulk_write/updatable.rb +0 -69
- data/lib/mongo/grid/fs.rb +0 -146
- data/lib/mongo/operation/aggregate/result.rb +0 -103
- data/lib/mongo/operation/aggregate.rb +0 -108
- data/lib/mongo/operation/command.rb +0 -61
- data/lib/mongo/operation/map_reduce/result.rb +0 -122
- data/lib/mongo/operation/map_reduce.rb +0 -95
- data/lib/mongo/operation/parallel_scan/result.rb +0 -72
- data/lib/mongo/operation/parallel_scan.rb +0 -76
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
- data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -21,32 +21,15 @@ module Mongo
|
|
21
21
|
# @since 2.0.0
|
22
22
|
module Readable
|
23
23
|
|
24
|
-
#
|
24
|
+
# The query modifier constant.
|
25
25
|
#
|
26
|
-
# @since 2.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
:$orderby => :sort,
|
31
|
-
:$hint => :hint,
|
32
|
-
:$comment => :comment,
|
33
|
-
:$snapshot => :snapshot,
|
34
|
-
:$maxScan => :max_scan,
|
35
|
-
:$maxTimeMS => :max_time_ms,
|
36
|
-
:$showDiskLoc => :show_disk_loc,
|
37
|
-
:$explain => :explained?
|
38
|
-
}.freeze
|
39
|
-
|
40
|
-
# Options to cursor flags mapping.
|
26
|
+
# @since 2.2.0
|
27
|
+
QUERY = '$query'.freeze
|
28
|
+
|
29
|
+
# The modifiers option constant.
|
41
30
|
#
|
42
|
-
# @since 2.
|
43
|
-
|
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
|
31
|
+
# @since 2.2.0
|
32
|
+
MODIFIERS = 'modifiers'.freeze
|
50
33
|
|
51
34
|
# Execute an aggregation on the collection view.
|
52
35
|
#
|
@@ -65,45 +48,28 @@ module Mongo
|
|
65
48
|
Aggregation.new(self, pipeline, options)
|
66
49
|
end
|
67
50
|
|
68
|
-
#
|
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)
|
51
|
+
# Allows the query to get partial results if some shards are down.
|
75
52
|
#
|
76
|
-
# @
|
53
|
+
# @example Allow partial results.
|
54
|
+
# view.allow_partial_results
|
77
55
|
#
|
78
|
-
# @return [
|
56
|
+
# @return [ View ] The new view.
|
79
57
|
#
|
80
|
-
# @since 2.
|
81
|
-
def
|
82
|
-
|
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
|
58
|
+
# @since 2.0.0
|
59
|
+
def allow_partial_results
|
60
|
+
configure(:allow_partial_results, true)
|
95
61
|
end
|
96
62
|
|
97
|
-
#
|
63
|
+
# Tell the query's cursor to stay open and wait for data.
|
98
64
|
#
|
99
|
-
# @example
|
100
|
-
# view.
|
65
|
+
# @example Await data on the cursor.
|
66
|
+
# view.await_data
|
101
67
|
#
|
102
68
|
# @return [ View ] The new view.
|
103
69
|
#
|
104
70
|
# @since 2.0.0
|
105
|
-
def
|
106
|
-
|
71
|
+
def await_data
|
72
|
+
configure(:await_data, true)
|
107
73
|
end
|
108
74
|
|
109
75
|
# The number of documents returned in each batch of results from MongoDB.
|
@@ -160,12 +126,15 @@ module Mongo
|
|
160
126
|
#
|
161
127
|
# @since 2.0.0
|
162
128
|
def count(options = {})
|
163
|
-
cmd = { :count => collection.name, :query =>
|
129
|
+
cmd = { :count => collection.name, :query => filter }
|
164
130
|
cmd[:skip] = options[:skip] if options[:skip]
|
165
131
|
cmd[:hint] = options[:hint] if options[:hint]
|
166
132
|
cmd[:limit] = options[:limit] if options[:limit]
|
167
133
|
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
168
|
-
|
134
|
+
cmd[:readConcern] = collection.read_concern if collection.read_concern
|
135
|
+
read_with_retry do
|
136
|
+
database.command(cmd, options).n.to_i
|
137
|
+
end
|
169
138
|
end
|
170
139
|
|
171
140
|
# Get a list of distinct values for a specific field.
|
@@ -186,9 +155,12 @@ module Mongo
|
|
186
155
|
def distinct(field_name, options={})
|
187
156
|
cmd = { :distinct => collection.name,
|
188
157
|
:key => field_name.to_s,
|
189
|
-
:query =>
|
158
|
+
:query => filter }
|
190
159
|
cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
|
191
|
-
|
160
|
+
cmd[:readConcern] = collection.read_concern if collection.read_concern
|
161
|
+
read_with_retry do
|
162
|
+
database.command(cmd, options).first['values']
|
163
|
+
end
|
192
164
|
end
|
193
165
|
|
194
166
|
# The index that MongoDB will be forced to use for the query.
|
@@ -249,6 +221,34 @@ module Mongo
|
|
249
221
|
configure(:max_scan, value)
|
250
222
|
end
|
251
223
|
|
224
|
+
# Set the maximum value to search.
|
225
|
+
#
|
226
|
+
# @example Set the max value.
|
227
|
+
# view.max_value(_id: 1)
|
228
|
+
#
|
229
|
+
# @param [ Hash ] value The max field and value.
|
230
|
+
#
|
231
|
+
# @return [ Hash, View ] The value or a new +View+.
|
232
|
+
#
|
233
|
+
# @since 2.1.0
|
234
|
+
def max_value(value = nil)
|
235
|
+
configure(:max_value, value)
|
236
|
+
end
|
237
|
+
|
238
|
+
# Set the minimum value to search.
|
239
|
+
#
|
240
|
+
# @example Set the min value.
|
241
|
+
# view.min_value(_id: 1)
|
242
|
+
#
|
243
|
+
# @param [ Hash ] value The min field and value.
|
244
|
+
#
|
245
|
+
# @return [ Hash, View ] The value or a new +View+.
|
246
|
+
#
|
247
|
+
# @since 2.1.0
|
248
|
+
def min_value(value = nil)
|
249
|
+
configure(:min_value, value)
|
250
|
+
end
|
251
|
+
|
252
252
|
# The server normally times out idle cursors after an inactivity period
|
253
253
|
# (10 minutes) to prevent excess memory use. Set this option to prevent that.
|
254
254
|
#
|
@@ -259,7 +259,7 @@ module Mongo
|
|
259
259
|
#
|
260
260
|
# @since 2.0.0
|
261
261
|
def no_cursor_timeout
|
262
|
-
|
262
|
+
configure(:no_cursor_timeout, true)
|
263
263
|
end
|
264
264
|
|
265
265
|
# The fields to include or exclude from each doc in the result set.
|
@@ -294,7 +294,22 @@ module Mongo
|
|
294
294
|
# @since 2.0.0
|
295
295
|
def read(value = nil)
|
296
296
|
return default_read if value.nil?
|
297
|
-
|
297
|
+
selector = value.is_a?(Hash) ? ServerSelector.get(client.options.merge(value)) : value
|
298
|
+
configure(:read, selector)
|
299
|
+
end
|
300
|
+
|
301
|
+
# Set whether to return only the indexed field or fields.
|
302
|
+
#
|
303
|
+
# @example Set the return key value.
|
304
|
+
# view.return_key(true)
|
305
|
+
#
|
306
|
+
# @param [ true, false ] value The return key value.
|
307
|
+
#
|
308
|
+
# @return [ true, false, View ] The value or a new +View+.
|
309
|
+
#
|
310
|
+
# @since 2.1.0
|
311
|
+
def return_key(value = nil)
|
312
|
+
configure(:return_key, value)
|
298
313
|
end
|
299
314
|
|
300
315
|
# Set whether the disk location should be shown for each document.
|
@@ -311,6 +326,7 @@ module Mongo
|
|
311
326
|
def show_disk_loc(value = nil)
|
312
327
|
configure(:show_disk_loc, value)
|
313
328
|
end
|
329
|
+
alias :show_record_id :show_disk_loc
|
314
330
|
|
315
331
|
# The number of docs to skip before returning results.
|
316
332
|
#
|
@@ -368,7 +384,23 @@ module Mongo
|
|
368
384
|
#
|
369
385
|
# @since 2.1.0
|
370
386
|
def modifiers(doc = nil)
|
371
|
-
|
387
|
+
return Builder::Modifiers.map_server_modifiers(options) if doc.nil?
|
388
|
+
new(options.merge(Builder::Modifiers.map_driver_options(doc)))
|
389
|
+
end
|
390
|
+
|
391
|
+
# A cumulative time limit in milliseconds for processing get more operations
|
392
|
+
# on a cursor.
|
393
|
+
#
|
394
|
+
# @example Set the max await time ms value.
|
395
|
+
# view.max_await_time_ms(500)
|
396
|
+
#
|
397
|
+
# @param [ Integer ] max The max time in milliseconds.
|
398
|
+
#
|
399
|
+
# @return [ Integer, View ] Either the max await time ms value or a new +View+.
|
400
|
+
#
|
401
|
+
# @since 2.1.0
|
402
|
+
def max_await_time_ms(max = nil)
|
403
|
+
configure(:max_await_time_ms, max)
|
372
404
|
end
|
373
405
|
|
374
406
|
# A cumulative time limit in milliseconds for processing operations on a cursor.
|
@@ -387,53 +419,35 @@ module Mongo
|
|
387
419
|
|
388
420
|
private
|
389
421
|
|
390
|
-
def default_read
|
422
|
+
def default_read
|
391
423
|
options[:read] || read_preference
|
392
424
|
end
|
393
425
|
|
394
|
-
def
|
395
|
-
|
396
|
-
|
397
|
-
|
426
|
+
def parallel_scan(cursor_count)
|
427
|
+
server = read.select_server(cluster, false)
|
428
|
+
Operation::Commands::ParallelScan.new(
|
429
|
+
:coll_name => collection.name,
|
430
|
+
:db_name => database.name,
|
431
|
+
:cursor_count => cursor_count,
|
432
|
+
:read_concern => collection.read_concern
|
433
|
+
).execute(server.context).cursor_ids.map do |cursor_id|
|
434
|
+
result = if server.features.find_command_enabled?
|
435
|
+
Operation::Commands::GetMore.new({
|
436
|
+
:selector => { :getMore => cursor_id, :collection => collection.name },
|
437
|
+
:db_name => database.name
|
438
|
+
}).execute(server.context)
|
439
|
+
else
|
440
|
+
Operation::Read::GetMore.new({
|
441
|
+
:to_return => 0,
|
442
|
+
:cursor_id => cursor_id,
|
443
|
+
:db_name => database.name,
|
444
|
+
:coll_name => collection.name
|
445
|
+
}).execute(server.context)
|
398
446
|
end
|
399
|
-
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
def has_special_fields?
|
404
|
-
modifiers || sort || hint || comment || max_time_ms || max_scan ||
|
405
|
-
show_disk_loc || snapshot || explained? || cluster.sharded?
|
406
|
-
end
|
407
|
-
|
408
|
-
def query_options
|
409
|
-
{ :project => projection, :skip => skip, :limit => to_return, :flags => flags }
|
410
|
-
end
|
411
|
-
|
412
|
-
def query_spec
|
413
|
-
sel = has_special_fields? ? special_selector : selector
|
414
|
-
{ :selector => sel,
|
415
|
-
:read => read,
|
416
|
-
:options => query_options,
|
417
|
-
:db_name => database.name,
|
418
|
-
:coll_name => collection.name }
|
419
|
-
end
|
420
|
-
|
421
|
-
def read_pref_formatted
|
422
|
-
read.to_mongos
|
423
|
-
end
|
424
|
-
|
425
|
-
def special_selector
|
426
|
-
SPECIAL_FIELDS.reduce({}) do |hash, (key, method)|
|
427
|
-
value = send(method) || (options[:modifiers] && options[:modifiers][key])
|
428
|
-
hash[key] = value if value
|
429
|
-
hash
|
447
|
+
Cursor.new(self, result, server)
|
430
448
|
end
|
431
449
|
end
|
432
450
|
|
433
|
-
def to_return
|
434
|
-
[ limit || batch_size, batch_size || limit ].min
|
435
|
-
end
|
436
|
-
|
437
451
|
def validate_doc!(doc)
|
438
452
|
raise Error::InvalidDocument.new unless doc.respond_to?(:keys)
|
439
453
|
end
|
@@ -31,11 +31,16 @@ module Mongo
|
|
31
31
|
#
|
32
32
|
# @since 2.0.0
|
33
33
|
def find_one_and_delete
|
34
|
-
cmd = { :findandmodify => collection.name, :query =>
|
34
|
+
cmd = { :findandmodify => collection.name, :query => filter, :remove => true }
|
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
|
-
|
38
|
+
wc = options[:write_concern] || (collection.write_concern &&
|
39
|
+
collection.write_concern.options)
|
40
|
+
cmd[:writeConcern] = wc if wc
|
41
|
+
write_with_retry do
|
42
|
+
database.command(cmd).first['value']
|
43
|
+
end
|
39
44
|
end
|
40
45
|
|
41
46
|
# Finds a single document and replaces it.
|
@@ -50,8 +55,11 @@ module Mongo
|
|
50
55
|
# @param [ Hash ] opts The options.
|
51
56
|
#
|
52
57
|
# @option opts [ Symbol ] :return_document Either :before or :after.
|
53
|
-
# @option opts [ true, false ] :upsert Whether to upsert if the
|
54
|
-
#
|
58
|
+
# @option opts [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
59
|
+
# @option opts [ true, false ] :bypass_document_validation Whether or
|
60
|
+
# not to skip document level validation.
|
61
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
62
|
+
# Defaults to the collection's write concern.
|
55
63
|
#
|
56
64
|
# @return [ BSON::Document ] The document.
|
57
65
|
#
|
@@ -69,20 +77,31 @@ module Mongo
|
|
69
77
|
# @param [ Hash ] opts The options.
|
70
78
|
#
|
71
79
|
# @option opts [ Symbol ] :return_document Either :before or :after.
|
80
|
+
# @option opts [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
81
|
+
# @option opts [ true, false ] :bypass_document_validation Whether or
|
82
|
+
# not to skip document level validation.
|
83
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
84
|
+
# Defaults to the collection's write concern.
|
72
85
|
#
|
73
86
|
# @return [ BSON::Document ] The document.
|
74
87
|
#
|
75
88
|
# @since 2.0.0
|
76
89
|
def find_one_and_update(document, opts = {})
|
77
|
-
cmd = { :findandmodify => collection.name, :query =>
|
90
|
+
cmd = { :findandmodify => collection.name, :query => filter }
|
78
91
|
cmd[:update] = document
|
79
92
|
cmd[:fields] = projection if projection
|
80
93
|
cmd[:sort] = sort if sort
|
81
94
|
cmd[:new] = !!(opts[:return_document] && opts[:return_document] == :after)
|
82
95
|
cmd[:upsert] = opts[:upsert] if opts[:upsert]
|
83
96
|
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
84
|
-
|
85
|
-
|
97
|
+
cmd[:bypassDocumentValidation] = !!opts[:bypass_document_validation]
|
98
|
+
wc = options[:write_concern] || (collection.write_concern &&
|
99
|
+
collection.write_concern.options)
|
100
|
+
cmd[:writeConcern] = wc if wc
|
101
|
+
write_with_retry do
|
102
|
+
value = database.command(cmd).first['value']
|
103
|
+
value unless value.nil? || value.empty?
|
104
|
+
end
|
86
105
|
end
|
87
106
|
|
88
107
|
# Remove documents from the collection.
|
@@ -166,24 +185,29 @@ module Mongo
|
|
166
185
|
private
|
167
186
|
|
168
187
|
def remove(value)
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
188
|
+
write_with_retry do
|
189
|
+
Operation::Write::Delete.new(
|
190
|
+
:delete => { Operation::Q => filter, Operation::LIMIT => value },
|
191
|
+
:db_name => collection.database.name,
|
192
|
+
:coll_name => collection.name,
|
193
|
+
:write_concern => collection.write_concern
|
194
|
+
).execute(next_primary.context)
|
195
|
+
end
|
175
196
|
end
|
176
197
|
|
177
198
|
def update(spec, multi, opts)
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
199
|
+
write_with_retry do
|
200
|
+
Operation::Write::Update.new(
|
201
|
+
:update => { Operation::Q => filter,
|
202
|
+
Operation::U => spec,
|
203
|
+
Operation::MULTI => multi,
|
204
|
+
Operation::UPSERT => !!opts[:upsert] },
|
205
|
+
:db_name => collection.database.name,
|
206
|
+
:coll_name => collection.name,
|
207
|
+
:write_concern => collection.write_concern,
|
208
|
+
:bypass_document_validation => !!opts[:bypass_document_validation]
|
209
|
+
).execute(next_primary.context)
|
210
|
+
end
|
187
211
|
end
|
188
212
|
end
|
189
213
|
end
|
@@ -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'
|
@@ -44,13 +45,15 @@ module Mongo
|
|
44
45
|
include Immutable
|
45
46
|
include Iterable
|
46
47
|
include Readable
|
48
|
+
include Retryable
|
47
49
|
include Explainable
|
48
50
|
include Writable
|
49
51
|
|
50
|
-
# @return [
|
52
|
+
# @return [ Collection ] The +Collection+ to query.
|
51
53
|
attr_reader :collection
|
52
|
-
|
53
|
-
|
54
|
+
|
55
|
+
# @return [ Hash ] The query filter.
|
56
|
+
attr_reader :filter
|
54
57
|
|
55
58
|
# Delegate necessary operations to the collection.
|
56
59
|
def_delegators :collection, :client, :cluster, :database, :read_preference, :write_concern
|
@@ -58,25 +61,27 @@ module Mongo
|
|
58
61
|
# Delegate to the cluster for the next primary.
|
59
62
|
def_delegators :cluster, :next_primary
|
60
63
|
|
64
|
+
alias :selector :filter
|
65
|
+
|
61
66
|
# Compare two +View+ objects.
|
62
67
|
#
|
63
68
|
# @example Compare the view with another object.
|
64
69
|
# view == other
|
65
70
|
#
|
66
|
-
# @return [ true, false ] Equal if collection,
|
71
|
+
# @return [ true, false ] Equal if collection, filter, and options of two
|
67
72
|
# +View+ match.
|
68
73
|
#
|
69
74
|
# @since 2.0.0
|
70
75
|
def ==(other)
|
71
76
|
return false unless other.is_a?(View)
|
72
77
|
collection == other.collection &&
|
73
|
-
|
78
|
+
filter == other.filter &&
|
74
79
|
options == other.options
|
75
80
|
end
|
76
81
|
alias_method :eql?, :==
|
77
82
|
|
78
83
|
# A hash value for the +View+ composed of the collection namespace,
|
79
|
-
# hash of the options and hash of the
|
84
|
+
# hash of the options and hash of the filter.
|
80
85
|
#
|
81
86
|
# @example Get the hash value.
|
82
87
|
# view.hash
|
@@ -85,7 +90,7 @@ module Mongo
|
|
85
90
|
#
|
86
91
|
# @since 2.0.0
|
87
92
|
def hash
|
88
|
-
[ collection.namespace, options.hash,
|
93
|
+
[ collection.namespace, options.hash, filter.hash ].hash
|
89
94
|
end
|
90
95
|
|
91
96
|
# Creates a new +View+.
|
@@ -100,7 +105,7 @@ module Mongo
|
|
100
105
|
# View.new(collection, {:name => 'Emily'}, :read => :secondary_preferred)
|
101
106
|
#
|
102
107
|
# @param [ Collection ] collection The +Collection+ to query.
|
103
|
-
# @param [ Hash ]
|
108
|
+
# @param [ Hash ] filter The query filter.
|
104
109
|
# @param [ Hash ] options The additional query options.
|
105
110
|
#
|
106
111
|
# @option options :comment [ String ] Associate a comment with the query.
|
@@ -124,11 +129,10 @@ module Mongo
|
|
124
129
|
# results.
|
125
130
|
#
|
126
131
|
# @since 2.0.0
|
127
|
-
def initialize(collection,
|
128
|
-
validate_doc!(
|
132
|
+
def initialize(collection, filter = {}, options = {})
|
133
|
+
validate_doc!(filter)
|
129
134
|
@collection = collection
|
130
|
-
|
131
|
-
@options = options.dup
|
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
|