mongo 2.3.1 → 2.4.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.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -3
  4. data/lib/mongo/bulk_write.rb +8 -7
  5. data/lib/mongo/bulk_write/combineable.rb +4 -0
  6. data/lib/mongo/bulk_write/transformable.rb +17 -5
  7. data/lib/mongo/bulk_write/validatable.rb +1 -0
  8. data/lib/mongo/client.rb +3 -0
  9. data/lib/mongo/cluster.rb +8 -0
  10. data/lib/mongo/cluster/app_metadata.rb +135 -0
  11. data/lib/mongo/collection.rb +42 -10
  12. data/lib/mongo/collection/view.rb +15 -1
  13. data/lib/mongo/collection/view/aggregation.rb +5 -0
  14. data/lib/mongo/collection/view/builder/aggregation.rb +13 -3
  15. data/lib/mongo/collection/view/builder/find_command.rb +7 -21
  16. data/lib/mongo/collection/view/builder/map_reduce.rb +22 -5
  17. data/lib/mongo/collection/view/iterable.rb +1 -0
  18. data/lib/mongo/collection/view/map_reduce.rb +5 -0
  19. data/lib/mongo/collection/view/readable.rb +35 -14
  20. data/lib/mongo/collection/view/writable.rb +54 -23
  21. data/lib/mongo/cursor/builder/get_more_command.rb +2 -3
  22. data/lib/mongo/database.rb +10 -2
  23. data/lib/mongo/error.rb +2 -0
  24. data/lib/mongo/error/invalid_application_name.rb +38 -0
  25. data/lib/mongo/error/invalid_server_preference.rb +24 -3
  26. data/lib/mongo/error/unsupported_collation.rb +51 -0
  27. data/lib/mongo/index/view.rb +28 -15
  28. data/lib/mongo/operation.rb +6 -0
  29. data/lib/mongo/operation/commands.rb +3 -0
  30. data/lib/mongo/operation/commands/aggregate.rb +10 -10
  31. data/lib/mongo/operation/commands/create.rb +45 -0
  32. data/lib/mongo/operation/commands/drop.rb +45 -0
  33. data/lib/mongo/operation/commands/drop_database.rb +45 -0
  34. data/lib/mongo/operation/commands/map_reduce.rb +12 -1
  35. data/lib/mongo/operation/commands/parallel_scan.rb +1 -0
  36. data/lib/mongo/operation/read_preference.rb +9 -9
  37. data/lib/mongo/operation/specifiable.rb +34 -0
  38. data/lib/mongo/operation/takes_write_concern.rb +35 -0
  39. data/lib/mongo/operation/write/bulk/bulkable.rb +1 -1
  40. data/lib/mongo/operation/write/command/create_index.rb +6 -0
  41. data/lib/mongo/operation/write/command/drop_index.rb +6 -0
  42. data/lib/mongo/operation/write/command/insert.rb +1 -1
  43. data/lib/mongo/operation/write/command/update.rb +1 -0
  44. data/lib/mongo/operation/write/command/writable.rb +2 -2
  45. data/lib/mongo/operation/write/create_index.rb +2 -2
  46. data/lib/mongo/operation/write/create_user.rb +1 -1
  47. data/lib/mongo/operation/write/delete.rb +5 -1
  48. data/lib/mongo/operation/write/gle.rb +1 -1
  49. data/lib/mongo/operation/write/insert.rb +2 -2
  50. data/lib/mongo/operation/write/remove_user.rb +1 -1
  51. data/lib/mongo/operation/write/update.rb +5 -1
  52. data/lib/mongo/operation/write/update_user.rb +1 -1
  53. data/lib/mongo/operation/write/write_command_enabled.rb +10 -2
  54. data/lib/mongo/protocol/insert.rb +1 -2
  55. data/lib/mongo/protocol/query.rb +3 -7
  56. data/lib/mongo/server.rb +8 -3
  57. data/lib/mongo/server/connection.rb +17 -11
  58. data/lib/mongo/server/description.rb +22 -0
  59. data/lib/mongo/server/description/features.rb +2 -0
  60. data/lib/mongo/server/monitor.rb +5 -0
  61. data/lib/mongo/server/monitor/connection.rb +11 -0
  62. data/lib/mongo/server_selector/nearest.rb +9 -6
  63. data/lib/mongo/server_selector/primary.rb +4 -0
  64. data/lib/mongo/server_selector/primary_preferred.rb +7 -1
  65. data/lib/mongo/server_selector/secondary.rb +5 -0
  66. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  67. data/lib/mongo/server_selector/selectable.rb +57 -10
  68. data/lib/mongo/socket/ssl.rb +1 -0
  69. data/lib/mongo/uri.rb +4 -0
  70. data/lib/mongo/version.rb +1 -1
  71. data/lib/mongo/write_concern.rb +1 -0
  72. data/mongo.gemspec +1 -1
  73. data/spec/mongo/auth/cr_spec.rb +7 -1
  74. data/spec/mongo/auth/ldap_spec.rb +7 -1
  75. data/spec/mongo/auth/scram_spec.rb +7 -1
  76. data/spec/mongo/auth/x509_spec.rb +7 -1
  77. data/spec/mongo/bulk_write_spec.rb +598 -5
  78. data/spec/mongo/client_spec.rb +47 -1
  79. data/spec/mongo/cluster/app_metadata_spec.rb +104 -0
  80. data/spec/mongo/cluster/topology/replica_set_spec.rb +14 -8
  81. data/spec/mongo/cluster/topology/sharded_spec.rb +9 -3
  82. data/spec/mongo/cluster/topology/single_spec.rb +10 -4
  83. data/spec/mongo/cluster_spec.rb +29 -0
  84. data/spec/mongo/collection/view/aggregation_spec.rb +139 -0
  85. data/spec/mongo/collection/view/builder/find_command_spec.rb +6 -243
  86. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -0
  87. data/spec/mongo/collection/view/readable_spec.rb +83 -0
  88. data/spec/mongo/collection/view/writable_spec.rb +447 -1
  89. data/spec/mongo/collection/view_spec.rb +57 -0
  90. data/spec/mongo/collection_spec.rb +926 -101
  91. data/spec/mongo/crud_spec.rb +4 -5
  92. data/spec/mongo/database_spec.rb +99 -1
  93. data/spec/mongo/index/view_spec.rb +360 -31
  94. data/spec/mongo/max_staleness_spec.rb +108 -0
  95. data/spec/mongo/operation/read_preference_spec.rb +8 -8
  96. data/spec/mongo/operation/write/command/delete_spec.rb +1 -1
  97. data/spec/mongo/operation/write/command/insert_spec.rb +1 -1
  98. data/spec/mongo/operation/write/command/update_spec.rb +1 -1
  99. data/spec/mongo/server/connection_pool_spec.rb +3 -1
  100. data/spec/mongo/server/connection_spec.rb +17 -7
  101. data/spec/mongo/server/description/features_spec.rb +50 -0
  102. data/spec/mongo/server/description_spec.rb +9 -3
  103. data/spec/mongo/server_selection_spec.rb +5 -3
  104. data/spec/mongo/server_selector/nearest_spec.rb +73 -0
  105. data/spec/mongo/server_selector/primary_preferred_spec.rb +73 -0
  106. data/spec/mongo/server_selector/primary_spec.rb +36 -0
  107. data/spec/mongo/server_selector/secondary_preferred_spec.rb +73 -0
  108. data/spec/mongo/server_selector/secondary_spec.rb +73 -0
  109. data/spec/mongo/server_selector_spec.rb +53 -0
  110. data/spec/mongo/server_spec.rb +3 -1
  111. data/spec/mongo/uri_spec.rb +54 -0
  112. data/spec/mongo/write_concern_spec.rb +18 -0
  113. data/spec/spec_helper.rb +10 -0
  114. data/spec/support/authorization.rb +8 -1
  115. data/spec/support/crud.rb +15 -0
  116. data/spec/support/crud/read.rb +27 -19
  117. data/spec/support/crud/write.rb +28 -3
  118. data/spec/support/crud_tests/read/aggregate.yml +15 -3
  119. data/spec/support/crud_tests/read/count.yml +14 -3
  120. data/spec/support/crud_tests/read/distinct.yml +13 -1
  121. data/spec/support/crud_tests/read/find.yml +12 -2
  122. data/spec/support/crud_tests/write/deleteMany.yml +22 -1
  123. data/spec/support/crud_tests/write/deleteOne.yml +20 -1
  124. data/spec/support/crud_tests/write/findOneAndDelete.yml +27 -2
  125. data/spec/support/crud_tests/write/findOneAndReplace.yml +43 -14
  126. data/spec/support/crud_tests/write/findOneAndUpdate.yml +50 -8
  127. data/spec/support/crud_tests/write/replaceOne.yml +34 -10
  128. data/spec/support/crud_tests/write/updateMany.yml +42 -11
  129. data/spec/support/crud_tests/write/updateOne.yml +32 -7
  130. data/spec/support/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
  131. data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
  132. data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
  133. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
  134. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
  135. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
  136. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
  137. data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
  138. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
  139. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
  140. data/spec/support/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
  141. data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
  142. data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
  143. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +25 -0
  144. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
  145. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
  146. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
  147. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
  148. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
  149. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
  150. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
  151. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
  152. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
  153. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
  154. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
  155. data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness.yml +29 -0
  156. data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness2.yml +29 -0
  157. data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +27 -0
  158. data/spec/support/max_staleness/Sharded/Incompatible.yml +25 -0
  159. data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +20 -0
  160. data/spec/support/max_staleness/Single/Incompatible.yml +18 -0
  161. data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +20 -0
  162. data/spec/support/server_selection.rb +25 -0
  163. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +27 -0
  164. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
  165. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
  166. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +34 -0
  167. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
  168. data/spec/support/shared/server_selector.rb +4 -3
  169. metadata +91 -6
  170. metadata.gz.sig +0 -0
@@ -3,7 +3,9 @@ require 'spec_helper'
3
3
  describe Mongo::Server do
4
4
 
5
5
  let(:cluster) do
6
- double('cluster')
6
+ double('cluster').tap do |cl|
7
+ allow(cl).to receive(:app_metadata).and_return(app_metadata)
8
+ end
7
9
  end
8
10
 
9
11
  let(:listeners) do
@@ -538,6 +538,52 @@ describe Mongo::URI do
538
538
  end
539
539
  end
540
540
 
541
+ context 'read preference max staleness option provided' do
542
+
543
+ let(:options) do
544
+ 'readPreference=Secondary&maxStalenessMS=120000'
545
+ end
546
+
547
+ let(:read) do
548
+ Mongo::Options::Redacted.new(mode: :secondary, :max_staleness => 120)
549
+ end
550
+
551
+ it 'sets the read preference max staleness in seconds' do
552
+ expect(uri.uri_options[:read]).to eq(read)
553
+ end
554
+
555
+ it 'sets the options on a client created with the uri' do
556
+ expect(Mongo::Client.new(string).options[:read]).to eq(read)
557
+ end
558
+
559
+ context 'when the read preference and max staleness combination is invalid' do
560
+
561
+ context 'when max staleness is combined with read preference mode primary' do
562
+
563
+ let(:options) do
564
+ 'readPreference=primary&maxStalenessMS=120000'
565
+ end
566
+
567
+ it 'raises an exception when read preference is accessed on the client' do
568
+ expect {
569
+ Mongo::Client.new(string).read_preference
570
+ }.to raise_exception(Mongo::Error::InvalidServerPreference)
571
+ end
572
+ end
573
+
574
+ context 'when the max staleness value is not at least twice heartbeat frequency' do
575
+
576
+ let(:options) do
577
+ 'readPreference=secondary&maxStalenessMS=1'
578
+ end
579
+
580
+ it 'does not raise an exception until the read preference is used' do
581
+ expect(Mongo::Client.new(string).read_preference).to be_a(Mongo::ServerSelector::Secondary)
582
+ end
583
+ end
584
+ end
585
+ end
586
+
541
587
  context 'replica set option provided' do
542
588
  let(:rs_name) { TEST_SET }
543
589
  let(:options) { "replicaSet=#{rs_name}" }
@@ -850,5 +896,13 @@ describe Mongo::URI do
850
896
  end
851
897
  end
852
898
  end
899
+
900
+ context 'when an app name option is provided' do
901
+ let(:options) { "appname=reports" }
902
+
903
+ it 'sets the app name on the client' do
904
+ expect(Mongo::Client.new(string).options[:app_name]).to eq(:reports)
905
+ end
906
+ end
853
907
  end
854
908
  end
@@ -15,6 +15,24 @@ describe Mongo::WriteConcern do
15
15
  end
16
16
  end
17
17
 
18
+ context 'when the value is a WriteConcern object' do
19
+
20
+ let(:value) do
21
+ Mongo::WriteConcern.get({})
22
+ end
23
+
24
+ it 'returns the object' do
25
+ expect(Mongo::WriteConcern.get(value)).to be(value)
26
+ end
27
+ end
28
+
29
+ context 'when the value is nil' do
30
+
31
+ it 'returns nil' do
32
+ expect(Mongo::WriteConcern.get(nil)).to be(nil)
33
+ end
34
+ end
35
+
18
36
  context 'when w is 0' do
19
37
 
20
38
  context 'when no other options are provided' do
@@ -4,6 +4,7 @@ CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
4
4
  SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
5
5
  SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
6
6
  SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
7
+ MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/support/max_staleness/**/*.yml")
7
8
  CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
8
9
  COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/support/command_monitoring/**/*.yml")
9
10
  CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/support/connection_string_tests/*.yml")
@@ -119,6 +120,15 @@ def single_seed?
119
120
  ADDRESSES.size == 1
120
121
  end
121
122
 
123
+ # For instances where behaviour is different on different versions, we need to
124
+ # determine in the specs if we are 3.4 or higher.
125
+ #
126
+ # @since 2.4.0
127
+ def collation_enabled?
128
+ $mongo_client ||= initialize_scanned_client!
129
+ $collation_enabled ||= $mongo_client.cluster.servers.first.features.collation_enabled?
130
+ end
131
+
122
132
  # For instances where behaviour is different on different versions, we need to
123
133
  # determine in the specs if we are 3.2 or higher.
124
134
  #
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2014 MongoDB, Inc.
1
+ # Copyright (C) 2009-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -249,5 +249,12 @@ module Authorization
249
249
  context.let(:default_address) do
250
250
  authorized_client.cluster.next_primary.address
251
251
  end
252
+
253
+ # Get a default app metadata.
254
+ #
255
+ # @since 2.4.0
256
+ context.let(:app_metadata) do
257
+ authorized_client.cluster.app_metadata
258
+ end
252
259
  end
253
260
  end
@@ -169,6 +169,21 @@ module Mongo
169
169
  !write_command_enabled && @operation.requires_2_6?(collection)
170
170
  end
171
171
 
172
+ # Whether this operation requires a certain server version to be run.
173
+ #
174
+ # @example Determine whether this operation requires a certain server feature.
175
+ # operation.feature_enabled?(collection)
176
+ #
177
+ # @param [ Collection ] collection The collection the operation
178
+ # should be executed on.
179
+ #
180
+ # @return [ true, false ] Whether this operation requires a certain server version.
181
+ #
182
+ # @since 2.4.0
183
+ def feature_enabled?(collection)
184
+ @operation.feature_enabled?(collection)
185
+ end
186
+
172
187
  private
173
188
 
174
189
  def outcome_collection_data
@@ -28,19 +28,10 @@ module Mongo
28
28
  ARGUMENT_MAP = { :sort => 'sort',
29
29
  :skip => 'skip',
30
30
  :batch_size => 'batchSize',
31
- :limit => 'limit'
31
+ :limit => 'limit',
32
+ :collation => 'collation'
32
33
  }
33
34
 
34
- # Map of read preference mode names to their equivalent Ruby-formatted symbols.
35
- #
36
- # @since 2.4.0
37
- READ_PREFERENCE_MAP = { 'primary' => :primary,
38
- 'secondary' => :secondary,
39
- 'primaryPreferred' => :primary_preferred,
40
- 'secondaryPreferred' => :secondary_preferred,
41
- 'nearest' => :nearest
42
- }
43
-
44
35
  # The operation name.
45
36
  #
46
37
  # @return [ String ] name The operation name.
@@ -100,6 +91,26 @@ module Mongo
100
91
  name == 'aggregate' && pipeline.find {|op| op.keys.include?('$out') }
101
92
  end
102
93
 
94
+ # Whether this operation requires a certain server version to be run.
95
+ #
96
+ # @example Determine whether this operation requires a certain server feature.
97
+ # operation.feature_enabled?(collection)
98
+ #
99
+ # @param [ Collection ] collection The collection the operation
100
+ # should be executed on.
101
+ #
102
+ # @return [ true, false ] Whether this operation requires a certain server version.
103
+ #
104
+ # @since 2.4.0
105
+ def feature_enabled?(collection)
106
+ if collation
107
+ return $mongo_client.cluster.servers.first.features.collation_enabled?
108
+ elsif requires_2_6?(collection)
109
+ return $mongo_client.cluster.servers.first.features.write_command_enabled?
110
+ end
111
+ true
112
+ end
113
+
103
114
  private
104
115
 
105
116
  def count(collection)
@@ -119,8 +130,7 @@ module Mongo
119
130
  end
120
131
 
121
132
  def find(collection)
122
- opts = modifiers ? options.merge(modifiers: BSON::Document.new(modifiers)) : options
123
- (read_preference ? collection.with(read: read_preference) : collection).find(filter, opts).to_a
133
+ collection.find(filter, options.merge(modifiers: BSON::Document.new(modifiers) || {})).to_a
124
134
  end
125
135
 
126
136
  def options
@@ -129,6 +139,10 @@ module Mongo
129
139
  end
130
140
  end
131
141
 
142
+ def collation
143
+ arguments['collation']
144
+ end
145
+
132
146
  def batch_size
133
147
  arguments['batchSize']
134
148
  end
@@ -152,12 +166,6 @@ module Mongo
152
166
  def arguments
153
167
  @spec['arguments']
154
168
  end
155
-
156
- def read_preference
157
- if @spec['read_preference'] && @spec['read_preference']['mode']
158
- { mode: READ_PREFERENCE_MAP[@spec['read_preference']['mode']] }
159
- end
160
- end
161
169
  end
162
170
  end
163
171
  end
@@ -47,7 +47,8 @@ module Mongo
47
47
  :return_document => 'returnDocument',
48
48
  :upsert => 'upsert',
49
49
  :ordered => 'ordered',
50
- :write_concern => 'writeConcern'
50
+ :write_concern => 'writeConcern',
51
+ :collation => 'collation'
51
52
  }
52
53
 
53
54
  # Operations that need a check if results on < 2.6 will match.
@@ -113,6 +114,26 @@ module Mongo
113
114
  REQUIRES_2_6.include?(name) && upsert
114
115
  end
115
116
 
117
+ # Whether this operation requires a certain server version to be run.
118
+ #
119
+ # @example Determine whether this operation requires a certain server feature.
120
+ # operation.feature_enabled?(collection)
121
+ #
122
+ # @param [ Collection ] collection The collection the operation
123
+ # should be executed on.
124
+ #
125
+ # @return [ true, false ] Whether this operation requires a certain server version.
126
+ #
127
+ # @since 2.4.0
128
+ def feature_enabled?(collection)
129
+ if collation
130
+ return $mongo_client.cluster.servers.first.features.collation_enabled?
131
+ elsif requires_2_6?(collection)
132
+ return $mongo_client.cluster.servers.first.features.write_command_enabled?
133
+ end
134
+ true
135
+ end
136
+
116
137
  private
117
138
 
118
139
  def bulk_write(collection)
@@ -120,12 +141,12 @@ module Mongo
120
141
  end
121
142
 
122
143
  def delete_many(collection)
123
- result = collection.delete_many(filter)
144
+ result = collection.delete_many(filter, options)
124
145
  { 'deletedCount' => result.deleted_count }
125
146
  end
126
147
 
127
148
  def delete_one(collection)
128
- result = collection.delete_one(filter)
149
+ result = collection.delete_one(filter, options)
129
150
  { 'deletedCount' => result.deleted_count }
130
151
  end
131
152
 
@@ -178,6 +199,10 @@ module Mongo
178
199
  end
179
200
  end
180
201
 
202
+ def collation
203
+ arguments['collation']
204
+ end
205
+
181
206
  def replacement
182
207
  arguments['replacement']
183
208
  end
@@ -2,6 +2,7 @@ data:
2
2
  - {_id: 1, x: 11}
3
3
  - {_id: 2, x: 22}
4
4
  - {_id: 3, x: 33}
5
+ - {_id: 4, x: 'ping'}
5
6
 
6
7
  tests:
7
8
  -
@@ -12,7 +13,7 @@ tests:
12
13
  pipeline:
13
14
  - $sort: {x: 1}
14
15
  - $match:
15
- _id: {$gt: 1}
16
+ _id: {$gt: 1, $lt: 4}
16
17
  batchSize: 2
17
18
 
18
19
  outcome:
@@ -27,7 +28,7 @@ tests:
27
28
  pipeline:
28
29
  - $sort: {x: 1}
29
30
  - $match:
30
- _id: {$gt: 1}
31
+ _id: {$gt: 1, $lt: 4}
31
32
  - $out: "other_test_collection"
32
33
  batchSize: 2
33
34
 
@@ -40,4 +41,15 @@ tests:
40
41
  data:
41
42
  - {_id: 2, x: 22}
42
43
  - {_id: 3, x: 33}
43
-
44
+ -
45
+ description: "Aggregate with collation"
46
+ operation:
47
+ name: aggregate
48
+ arguments:
49
+ pipeline:
50
+ - $match:
51
+ x: 'PING'
52
+ collation: { locale: 'en_US', strength: 2 }
53
+ outcome:
54
+ result:
55
+ - {_id: 4, x: 'ping'}
@@ -2,6 +2,7 @@ data:
2
2
  - {_id: 1, x: 11}
3
3
  - {_id: 2, x: 22}
4
4
  - {_id: 3, x: 33}
5
+ - {_id: 4, x: 'PING'}
5
6
 
6
7
  tests:
7
8
  -
@@ -12,14 +13,14 @@ tests:
12
13
  filter: { }
13
14
 
14
15
  outcome:
15
- result: 3
16
+ result: 4
16
17
  -
17
18
  description: "Count with a filter"
18
19
  operation:
19
20
  name: count
20
21
  arguments:
21
22
  filter:
22
- _id: {$gt: 1}
23
+ _id: {$gt: 1, $lt: 4}
23
24
 
24
25
  outcome:
25
26
  result: 2
@@ -33,5 +34,15 @@ tests:
33
34
  limit: 3
34
35
 
35
36
  outcome:
36
- result: 2
37
+ result: 3
38
+ -
39
+ description: "Count with collation"
40
+ operation:
41
+ name: count
42
+ arguments:
43
+ filter: { x: 'ping' }
44
+ collation: { locale: 'en_US', strength: 2 }
45
+
46
+ outcome:
47
+ result: 1
37
48
 
@@ -2,6 +2,8 @@ data:
2
2
  - {_id: 1, x: 11}
3
3
  - {_id: 2, x: 22}
4
4
  - {_id: 3, x: 33}
5
+ - {_id: 4, string: 'PING'}
6
+ - {_id: 5, string: 'ping'}
5
7
 
6
8
  tests:
7
9
  -
@@ -30,4 +32,14 @@ tests:
30
32
  result:
31
33
  - 22
32
34
  - 33
33
-
35
+ -
36
+ description: "Distinct with a collation"
37
+ operation:
38
+ name: distinct
39
+ arguments:
40
+ fieldName: "string"
41
+ collation: { locale: 'en_US', strength: 2 }
42
+
43
+ outcome:
44
+ result:
45
+ - 'PING'
@@ -4,6 +4,7 @@ data:
4
4
  - {_id: 3, x: 33}
5
5
  - {_id: 4, x: 44}
6
6
  - {_id: 5, x: 55}
7
+ - {_id: 6, x: 'ping'}
7
8
 
8
9
  tests:
9
10
  -
@@ -23,7 +24,7 @@ tests:
23
24
  name: "find"
24
25
  arguments:
25
26
  filter:
26
- _id: {$gt: 2}
27
+ _id: {$gt: 2, $lt: 6}
27
28
  sort: {_id: 1}
28
29
  skip: 2
29
30
  limit: 2
@@ -47,4 +48,13 @@ tests:
47
48
  - {_id: 2, x: 22}
48
49
  - {_id: 3, x: 33}
49
50
  - {_id: 4, x: 44}
50
-
51
+ -
52
+ description: "Find with a collation"
53
+ operation:
54
+ name: "find"
55
+ arguments:
56
+ filter: {x: 'PING'}
57
+ collation: { locale: 'en_US', strength: 2 }
58
+ outcome:
59
+ result:
60
+ - {_id: 6, x: 'ping'}