mongo 2.0.6 → 2.1.0
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 +5 -2
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +18 -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 +191 -0
- 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 +159 -23
- data/lib/mongo/client.rb +52 -16
- data/lib/mongo/cluster/topology/replica_set.rb +27 -9
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +42 -7
- data/lib/mongo/collection/view/aggregation.rb +48 -9
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +18 -4
- data/lib/mongo/collection/view/map_reduce.rb +58 -17
- data/lib/mongo/collection/view/readable.rb +173 -42
- data/lib/mongo/collection/view/writable.rb +37 -23
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection.rb +370 -33
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +5 -4
- data/lib/mongo/database.rb +14 -4
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error/closed_stream.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +34 -0
- data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
- 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/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- 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 +13 -2
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +13 -10
- 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 +3 -3
- 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 +112 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +89 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +18 -0
- data/lib/mongo/monitoring/publishable.rb +106 -0
- data/lib/mongo/monitoring.rb +195 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/collections_info.rb +68 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
- 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 +13 -1
- data/lib/mongo/operation/specifiable.rb +42 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -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 +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- 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 +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- 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 +32 -4
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/delete.rb +75 -15
- data/lib/mongo/protocol/get_more.rb +65 -13
- data/lib/mongo/protocol/insert.rb +85 -13
- data/lib/mongo/protocol/kill_cursors.rb +59 -14
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +163 -37
- data/lib/mongo/protocol/reply.rb +103 -0
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +82 -14
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server/connectable.rb +21 -25
- data/lib/mongo/server/connection.rb +75 -4
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/description.rb +52 -1
- data/lib/mongo/server/monitor/connection.rb +26 -2
- data/lib/mongo/server/monitor.rb +19 -3
- data/lib/mongo/server.rb +39 -5
- data/lib/mongo/server_selector/selectable.rb +40 -31
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +3 -3
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +248 -137
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +5 -3
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +428 -0
- data/spec/mongo/client_spec.rb +167 -17
- data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -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 +188 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
- data/spec/mongo/collection/view/readable_spec.rb +238 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +459 -71
- data/spec/mongo/collection_spec.rb +1291 -9
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +47 -11
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- 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/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/monitoring_spec.rb +168 -0
- 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} +0 -18
- 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/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +4 -4
- data/spec/mongo/operation/write/insert_spec.rb +2 -13
- data/spec/mongo/operation/write/update_spec.rb +7 -7
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/protocol/query_spec.rb +15 -30
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +50 -6
- data/spec/mongo/server/connection_spec.rb +49 -4
- data/spec/mongo/server/description_spec.rb +49 -3
- data/spec/mongo/server/monitor_spec.rb +51 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +19 -9
- 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 +94 -8
- data/spec/mongo/socket/ssl_spec.rb +123 -13
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +295 -67
- data/spec/spec_helper.rb +40 -24
- data/spec/support/authorization.rb +23 -9
- data/spec/support/certificates/client.pem +4 -4
- 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 +219 -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 +365 -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 +22 -19
- data/spec/support/crud/write.rb +58 -27
- 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 +1 -1
- data/spec/support/sdam/rs/equal_electionids.yml +44 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -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/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/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -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 +22 -3
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +218 -22
- data/spec/support/shared/server_selector.rb +80 -14
- data.tar.gz.sig +0 -0
- metadata +188 -59
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
- data/lib/mongo/bulk_write/deletable.rb +0 -56
- data/lib/mongo/bulk_write/insertable.rb +0 -48
- data/lib/mongo/bulk_write/replacable.rb +0 -57
- data/lib/mongo/bulk_write/updatable.rb +0 -68
- data/lib/mongo/grid/fs.rb +0 -149
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- 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 -162
- 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/bulk/bulk_write_spec.rb +0 -262
- 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
- /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -0,0 +1,174 @@
|
|
1
|
+
# Copyright (C) 2014-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
|
+
module Operation
|
17
|
+
module Write
|
18
|
+
module Bulk
|
19
|
+
class Update
|
20
|
+
|
21
|
+
# Defines custom behaviour of results when updating.
|
22
|
+
#
|
23
|
+
# @since 2.0.0
|
24
|
+
class Result < Operation::Result
|
25
|
+
include Mergable
|
26
|
+
|
27
|
+
# The number of modified docs field in the result.
|
28
|
+
#
|
29
|
+
# @since 2.0.0
|
30
|
+
MODIFIED = 'nModified'.freeze
|
31
|
+
|
32
|
+
# The upserted docs field in the result.
|
33
|
+
#
|
34
|
+
# @since 2.0.0
|
35
|
+
UPSERTED = 'upserted'.freeze
|
36
|
+
|
37
|
+
# Gets the number of documents upserted.
|
38
|
+
#
|
39
|
+
# @example Get the upserted count.
|
40
|
+
# result.n_upserted
|
41
|
+
#
|
42
|
+
# @return [ Integer ] The number of documents upserted.
|
43
|
+
#
|
44
|
+
# @since 2.0.0
|
45
|
+
def n_upserted
|
46
|
+
return 0 unless acknowledged?
|
47
|
+
@replies.reduce(0) do |n, reply|
|
48
|
+
if upsert?(reply)
|
49
|
+
n += 1
|
50
|
+
else
|
51
|
+
n += 0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Gets the number of documents matched.
|
57
|
+
#
|
58
|
+
# @example Get the matched count.
|
59
|
+
# result.n_matched
|
60
|
+
#
|
61
|
+
# @return [ Integer ] The number of documents matched.
|
62
|
+
#
|
63
|
+
# @since 2.0.0
|
64
|
+
def n_matched
|
65
|
+
return 0 unless acknowledged?
|
66
|
+
@replies.reduce(0) do |n, reply|
|
67
|
+
if upsert?(reply)
|
68
|
+
n += 0
|
69
|
+
else
|
70
|
+
n += reply.documents.first[N]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Gets the number of documents modified.
|
76
|
+
#
|
77
|
+
# @example Get the modified count.
|
78
|
+
# result.n_modified
|
79
|
+
#
|
80
|
+
# @return [ Integer ] The number of documents modified.
|
81
|
+
#
|
82
|
+
# @since 2.0.0
|
83
|
+
def n_modified
|
84
|
+
return 0 unless acknowledged?
|
85
|
+
@replies.reduce(0) do |n, reply|
|
86
|
+
n += reply.documents.first[MODIFIED] || 0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Get the upserted documents.
|
91
|
+
#
|
92
|
+
# @example Get upserted documents.
|
93
|
+
# result.upserted
|
94
|
+
#
|
95
|
+
# @return [ Array<BSON::Document> ] The upserted document info
|
96
|
+
#
|
97
|
+
# @since 2.1.0
|
98
|
+
def upserted
|
99
|
+
reply.documents.first[UPSERTED] || []
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def upsert?(reply)
|
105
|
+
upserted.any?
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Defines custom behaviour of results when updating.
|
110
|
+
# For server versions < 2.5.5 (that don't use write commands).
|
111
|
+
#
|
112
|
+
# @since 2.0.0
|
113
|
+
class LegacyResult < Operation::Result
|
114
|
+
include LegacyMergable
|
115
|
+
|
116
|
+
# The updated existing field in the result.
|
117
|
+
#
|
118
|
+
# @since 2.0.0
|
119
|
+
UPDATED_EXISTING = 'updatedExisting'.freeze
|
120
|
+
|
121
|
+
# Gets the number of documents upserted.
|
122
|
+
#
|
123
|
+
# @example Get the upserted count.
|
124
|
+
# result.n_upserted
|
125
|
+
#
|
126
|
+
# @return [ Integer ] The number of documents upserted.
|
127
|
+
#
|
128
|
+
# @since 2.0.0
|
129
|
+
def n_upserted
|
130
|
+
return 0 unless acknowledged?
|
131
|
+
@replies.reduce(0) do |n, reply|
|
132
|
+
if upsert?(reply)
|
133
|
+
n += reply.documents.first[N]
|
134
|
+
else
|
135
|
+
n
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Gets the number of documents matched.
|
141
|
+
#
|
142
|
+
# @example Get the matched count.
|
143
|
+
# result.n_matched
|
144
|
+
#
|
145
|
+
# @return [ Integer ] The number of documents matched.
|
146
|
+
#
|
147
|
+
# @since 2.0.0
|
148
|
+
def n_matched
|
149
|
+
return 0 unless acknowledged?
|
150
|
+
@replies.reduce(0) do |n, reply|
|
151
|
+
if upsert?(reply)
|
152
|
+
n
|
153
|
+
else
|
154
|
+
n += reply.documents.first[N]
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
alias :n_modified :n_matched
|
159
|
+
|
160
|
+
private
|
161
|
+
|
162
|
+
def upsert?(reply)
|
163
|
+
!updated_existing?(reply) && reply.documents.first[N] == 1
|
164
|
+
end
|
165
|
+
|
166
|
+
def updated_existing?(reply)
|
167
|
+
reply.documents.first[UPDATED_EXISTING]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# Copyright (C) 2014-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
|
+
require 'mongo/operation/write/bulk/update/result'
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
module Operation
|
19
|
+
module Write
|
20
|
+
module Bulk
|
21
|
+
|
22
|
+
# A MongoDB bulk update operation.
|
23
|
+
#
|
24
|
+
# @note If the server version is >= 2.5.5, a write command operation
|
25
|
+
# will be created and sent instead.
|
26
|
+
#
|
27
|
+
# @example Create the update operation.
|
28
|
+
# Write::BulkUpdate.new({
|
29
|
+
# :updates => [
|
30
|
+
# {
|
31
|
+
# :q => { :foo => 1 },
|
32
|
+
# :u => { :$set => { :bar => 1 }},
|
33
|
+
# :multi => true,
|
34
|
+
# :upsert => false
|
35
|
+
# }
|
36
|
+
# ],
|
37
|
+
# :db_name => 'test',
|
38
|
+
# :coll_name => 'test_coll',
|
39
|
+
# :write_concern => write_concern,
|
40
|
+
# :ordered => false
|
41
|
+
# })
|
42
|
+
#
|
43
|
+
# Initialization:
|
44
|
+
# param [ Hash ] spec The specifications for the update.
|
45
|
+
#
|
46
|
+
# option spec :updates [ Array ] The update documents.
|
47
|
+
# option spec :db_name [ String ] The name of the database on which
|
48
|
+
# the query should be run.
|
49
|
+
# option spec :coll_name [ String ] The name of the collection on which
|
50
|
+
# the query should be run.
|
51
|
+
# option spec :write_concern [ Mongo::WriteConcern ] The write concern.
|
52
|
+
# option spec :ordered [ true, false ] Whether the operations should be
|
53
|
+
# executed in order.
|
54
|
+
# option spec :options [ Hash ] Options for the command, if it ends up being a
|
55
|
+
# write command.
|
56
|
+
#
|
57
|
+
# @since 2.0.0
|
58
|
+
class Update
|
59
|
+
include Bulkable
|
60
|
+
include Specifiable
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def execute_write_command(context)
|
65
|
+
Result.new(Command::Update.new(spec).execute(context))
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def messages
|
70
|
+
updates.collect do |u|
|
71
|
+
opts = { :flags => [] }
|
72
|
+
opts[:flags] << :multi_update if !!u[Operation::MULTI]
|
73
|
+
opts[:flags] << :upsert if !!u[Operation::UPSERT]
|
74
|
+
Protocol::Update.new(db_name, coll_name, u[Operation::Q], u[Operation::U], opts)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -12,6 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require 'mongo/operation/write/bulk/
|
16
|
-
require 'mongo/operation/write/bulk/
|
17
|
-
require 'mongo/operation/write/bulk/
|
15
|
+
require 'mongo/operation/write/bulk/mergable'
|
16
|
+
require 'mongo/operation/write/bulk/legacy_mergable'
|
17
|
+
require 'mongo/operation/write/bulk/bulkable'
|
18
|
+
require 'mongo/operation/write/bulk/delete'
|
19
|
+
require 'mongo/operation/write/bulk/insert'
|
20
|
+
require 'mongo/operation/write/bulk/update'
|
@@ -17,35 +17,30 @@ module Mongo
|
|
17
17
|
module Write
|
18
18
|
module Command
|
19
19
|
|
20
|
-
# Provides common behavior for
|
20
|
+
# Provides common behavior for write commands.
|
21
|
+
# Assigns an operation id when executed.
|
21
22
|
#
|
22
23
|
# @since 2.0.0
|
23
24
|
module Writable
|
24
25
|
include Limited
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
#
|
27
|
+
# Execute the operation.
|
28
|
+
# The context gets a connection on which the operation
|
29
|
+
# is sent in the block.
|
29
30
|
#
|
30
|
-
# @
|
31
|
-
def secondary_ok?
|
32
|
-
false
|
33
|
-
end
|
34
|
-
|
35
|
-
# Whether the batch writes should be applied in the same order the
|
36
|
-
# items appear, ie. sequentially.
|
37
|
-
# If ordered is false, the server applies the batch items in no particular
|
38
|
-
# order, and possibly in parallel. Execution halts after the first error.
|
39
|
-
# The default value is true, which means the batch items are applied
|
40
|
-
# sequentially.
|
31
|
+
# @param [ Mongo::Server::Context ] context The context for this operation.
|
41
32
|
#
|
42
|
-
# @return [
|
33
|
+
# @return [ Result ] The operation response, if there is one.
|
43
34
|
#
|
44
35
|
# @since 2.0.0
|
45
|
-
def
|
46
|
-
|
36
|
+
def execute(context)
|
37
|
+
context.with_connection do |connection|
|
38
|
+
connection.dispatch([ message ], operation_id)
|
39
|
+
end
|
47
40
|
end
|
48
41
|
|
42
|
+
private
|
43
|
+
|
49
44
|
# The wire protocol message for this write operation.
|
50
45
|
#
|
51
46
|
# @return [ Mongo::Protocol::Query ] Wire protocol message.
|
@@ -42,37 +42,14 @@ module Mongo
|
|
42
42
|
#
|
43
43
|
# @since 2.0.0
|
44
44
|
class CreateIndex
|
45
|
-
include
|
45
|
+
include GLE
|
46
|
+
include WriteCommandEnabled
|
46
47
|
include Specifiable
|
47
48
|
|
48
|
-
# Execute the ensure index operation.
|
49
|
-
#
|
50
|
-
# @example Execute the operation.
|
51
|
-
# operation.execute(context)
|
52
|
-
#
|
53
|
-
# @param [ Mongo::Server::Context ] context The context for this operation.
|
54
|
-
#
|
55
|
-
# @return [ Result ] The result of the operation.
|
56
|
-
#
|
57
|
-
# @since 2.0.0
|
58
|
-
def execute(context)
|
59
|
-
if context.features.write_command_enabled?
|
60
|
-
execute_write_command(context)
|
61
|
-
else
|
62
|
-
execute_message(context)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
49
|
private
|
67
50
|
|
68
|
-
def
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
def execute_message(context)
|
73
|
-
context.with_connection do |connection|
|
74
|
-
Result.new(connection.dispatch([ message, gle ].compact)).validate!
|
75
|
-
end
|
51
|
+
def write_command_op
|
52
|
+
Command::CreateIndex.new(spec)
|
76
53
|
end
|
77
54
|
|
78
55
|
def index_documents
|
@@ -30,40 +30,14 @@ module Mongo
|
|
30
30
|
#
|
31
31
|
# @since 2.0.0
|
32
32
|
class CreateUser
|
33
|
-
include
|
33
|
+
include GLE
|
34
|
+
include WriteCommandEnabled
|
34
35
|
include Specifiable
|
35
36
|
|
36
|
-
# Execute the operation.
|
37
|
-
#
|
38
|
-
# @note Creating users behaves different on 2.7+, 2.6.x, and
|
39
|
-
# 2.4- so we need to break this out into separate operations.
|
40
|
-
#
|
41
|
-
# @example Execute the operation.
|
42
|
-
# operation.execute(context)
|
43
|
-
#
|
44
|
-
# @param [ Mongo::Server::Context ] context The context for this operation.
|
45
|
-
#
|
46
|
-
# @return [ Result ] The operation result.
|
47
|
-
#
|
48
|
-
# @since 2.0.0
|
49
|
-
def execute(context)
|
50
|
-
if context.features.write_command_enabled?
|
51
|
-
execute_write_command(context)
|
52
|
-
else
|
53
|
-
execute_message(context)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
37
|
private
|
58
38
|
|
59
|
-
def
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def execute_message(context)
|
64
|
-
context.with_connection do |connection|
|
65
|
-
Result.new(connection.dispatch([ message, gle ].compact)).validate!
|
66
|
-
end
|
39
|
+
def write_command_op
|
40
|
+
Command::CreateUser.new(spec)
|
67
41
|
end
|
68
42
|
|
69
43
|
def message
|
@@ -48,44 +48,21 @@ module Mongo
|
|
48
48
|
#
|
49
49
|
# @since 2.0.0
|
50
50
|
class Delete
|
51
|
-
include
|
51
|
+
include GLE
|
52
|
+
include WriteCommandEnabled
|
52
53
|
include Specifiable
|
53
54
|
|
54
|
-
# Execute the delete operation.
|
55
|
-
#
|
56
|
-
# @example Execute the operation.
|
57
|
-
# operation.execute(context)
|
58
|
-
#
|
59
|
-
# @param [ Mongo::Server::Context ] context The context for this operation.
|
60
|
-
#
|
61
|
-
# @return [ Result ] The result.
|
62
|
-
#
|
63
|
-
# @since 2.0.0
|
64
|
-
def execute(context)
|
65
|
-
if context.features.write_command_enabled?
|
66
|
-
execute_write_command(context)
|
67
|
-
else
|
68
|
-
execute_message(context)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
55
|
private
|
73
56
|
|
74
|
-
def
|
57
|
+
def write_command_op
|
75
58
|
s = spec.merge(:deletes => [ delete ])
|
76
59
|
s.delete(:delete)
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
def execute_message(context)
|
81
|
-
context.with_connection do |connection|
|
82
|
-
Result.new(connection.dispatch([ message, gle ].compact)).validate!
|
83
|
-
end
|
60
|
+
Command::Delete.new(s)
|
84
61
|
end
|
85
62
|
|
86
63
|
def message
|
87
|
-
selector = delete[
|
88
|
-
opts = (
|
64
|
+
selector = delete[Operation::Q]
|
65
|
+
opts = (delete[Operation::LIMIT] || 0) <= 0 ? {} : { :flags => [ :single_remove ] }
|
89
66
|
Protocol::Delete.new(db_name, coll_name, selector, opts)
|
90
67
|
end
|
91
68
|
end
|
@@ -35,7 +35,7 @@ module Mongo
|
|
35
35
|
#
|
36
36
|
# @since 2.0.0
|
37
37
|
class DropIndex
|
38
|
-
include
|
38
|
+
include WriteCommandEnabled
|
39
39
|
include Specifiable
|
40
40
|
|
41
41
|
# Execute the drop index operation.
|
@@ -54,8 +54,8 @@ module Mongo
|
|
54
54
|
|
55
55
|
private
|
56
56
|
|
57
|
-
def
|
58
|
-
|
57
|
+
def write_command_op
|
58
|
+
Command::DropIndex.new(spec)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (C) 2014-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
|
+
module Operation
|
17
|
+
module Write
|
18
|
+
|
19
|
+
# This module contains common functionality for operations that need to
|
20
|
+
# be followed by a GLE message.
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
module GLE
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def execute_message(context)
|
28
|
+
context.with_connection do |connection|
|
29
|
+
result_class = defined?(self.class::LegacyResult) ? self.class::LegacyResult :
|
30
|
+
defined?(self.class::Result) ? self.class::Result : Result
|
31
|
+
result_class.new(connection.dispatch([ message, gle ].compact)).validate!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def gle
|
36
|
+
if gle_message = write_concern.get_last_error
|
37
|
+
Protocol::Query.new(
|
38
|
+
db_name,
|
39
|
+
Database::COMMAND,
|
40
|
+
gle_message,
|
41
|
+
options.merge(limit: -1)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -15,6 +15,11 @@
|
|
15
15
|
module Mongo
|
16
16
|
module Operation
|
17
17
|
module Write
|
18
|
+
|
19
|
+
# This module provides functionality to ensure that documents contain
|
20
|
+
# an id field. Used by insert operations (Bulk, legacy, write command inserts).
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
18
23
|
module Idable
|
19
24
|
|
20
25
|
private
|
@@ -43,28 +43,11 @@ module Mongo
|
|
43
43
|
#
|
44
44
|
# @since 2.0.0
|
45
45
|
class Insert
|
46
|
-
include
|
46
|
+
include GLE
|
47
|
+
include WriteCommandEnabled
|
47
48
|
include Specifiable
|
48
49
|
include Idable
|
49
50
|
|
50
|
-
# Execute the insert operation.
|
51
|
-
#
|
52
|
-
# @example Execute the operation.
|
53
|
-
# operation.execute(context)
|
54
|
-
#
|
55
|
-
# @param [ Mongo::Server::Context ] context The context for this operation.
|
56
|
-
#
|
57
|
-
# @return [ Result ] The operation result.
|
58
|
-
#
|
59
|
-
# @since 2.0.0
|
60
|
-
def execute(context)
|
61
|
-
if context.features.write_command_enabled?
|
62
|
-
execute_write_command(context)
|
63
|
-
else
|
64
|
-
execute_message(context)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
51
|
private
|
69
52
|
|
70
53
|
def execute_write_command(context)
|
@@ -78,11 +61,6 @@ module Mongo
|
|
78
61
|
end
|
79
62
|
end
|
80
63
|
|
81
|
-
def initialize_copy(original)
|
82
|
-
@spec = original.spec.dup
|
83
|
-
@spec[:documents] = original.spec[:documents].dup
|
84
|
-
end
|
85
|
-
|
86
64
|
def message
|
87
65
|
opts = !!options[:continue_on_error] ? { :flags => [:continue_on_error] } : {}
|
88
66
|
Protocol::Insert.new(db_name, coll_name, ensure_ids(documents), opts)
|