mongo 2.4.3 → 2.5.0.beta

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 (235) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -2
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +3 -2
  5. data/lib/mongo/auth/cr.rb +6 -4
  6. data/lib/mongo/auth/cr/conversation.rb +33 -17
  7. data/lib/mongo/auth/ldap.rb +4 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +19 -9
  9. data/lib/mongo/auth/scram.rb +7 -4
  10. data/lib/mongo/auth/scram/conversation.rb +62 -24
  11. data/lib/mongo/auth/user.rb +10 -0
  12. data/lib/mongo/auth/user/view.rb +44 -22
  13. data/lib/mongo/auth/x509.rb +4 -2
  14. data/lib/mongo/auth/x509/conversation.rb +19 -9
  15. data/lib/mongo/bulk_write.rb +33 -27
  16. data/lib/mongo/bulk_write/combineable.rb +5 -0
  17. data/lib/mongo/bulk_write/transformable.rb +2 -0
  18. data/lib/mongo/bulk_write/validatable.rb +4 -0
  19. data/lib/mongo/client.rb +123 -12
  20. data/lib/mongo/cluster.rb +52 -11
  21. data/lib/mongo/cluster/app_metadata.rb +8 -2
  22. data/lib/mongo/cluster/cursor_reaper.rb +0 -1
  23. data/lib/mongo/cluster/topology.rb +1 -1
  24. data/lib/mongo/collection.rb +114 -27
  25. data/lib/mongo/collection/view.rb +8 -2
  26. data/lib/mongo/collection/view/aggregation.rb +11 -7
  27. data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
  28. data/lib/mongo/collection/view/builder/find_command.rb +5 -3
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
  30. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  31. data/lib/mongo/collection/view/change_stream.rb +160 -0
  32. data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
  33. data/lib/mongo/collection/view/iterable.rb +11 -10
  34. data/lib/mongo/collection/view/map_reduce.rb +22 -18
  35. data/lib/mongo/collection/view/readable.rb +51 -37
  36. data/lib/mongo/collection/view/writable.rb +72 -40
  37. data/lib/mongo/cursor.rb +25 -4
  38. data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
  39. data/lib/mongo/database.rb +22 -11
  40. data/lib/mongo/database/view.rb +16 -12
  41. data/lib/mongo/error.rb +5 -0
  42. data/lib/mongo/error/invalid_session.rb +36 -0
  43. data/lib/mongo/error/missing_resume_token.rb +39 -0
  44. data/lib/mongo/error/operation_failure.rb +17 -0
  45. data/lib/mongo/error/parser.rb +3 -2
  46. data/lib/mongo/error/unknown_payload_type.rb +41 -0
  47. data/lib/mongo/error/unsupported_array_filters.rb +51 -0
  48. data/lib/mongo/error/unsupported_message_type.rb +23 -0
  49. data/lib/mongo/grid/fs_bucket.rb +5 -4
  50. data/lib/mongo/grid/stream/read.rb +3 -2
  51. data/lib/mongo/grid/stream/write.rb +2 -2
  52. data/lib/mongo/index/view.rb +35 -25
  53. data/lib/mongo/monitoring/event/secure.rb +14 -0
  54. data/lib/mongo/operation.rb +16 -0
  55. data/lib/mongo/operation/commands.rb +1 -0
  56. data/lib/mongo/operation/commands/aggregate.rb +9 -5
  57. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  58. data/lib/mongo/operation/commands/collections_info.rb +6 -6
  59. data/lib/mongo/operation/commands/command.rb +2 -1
  60. data/lib/mongo/operation/commands/create.rb +6 -2
  61. data/lib/mongo/operation/commands/drop.rb +6 -2
  62. data/lib/mongo/operation/commands/drop_database.rb +6 -2
  63. data/lib/mongo/operation/commands/explain.rb +27 -0
  64. data/lib/mongo/operation/commands/explain/result.rb +52 -0
  65. data/lib/mongo/operation/commands/indexes.rb +1 -1
  66. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  67. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  68. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  70. data/lib/mongo/operation/commands/map_reduce.rb +8 -4
  71. data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
  72. data/lib/mongo/operation/commands/user_query.rb +1 -1
  73. data/lib/mongo/operation/commands/users_info.rb +6 -2
  74. data/lib/mongo/operation/executable.rb +4 -1
  75. data/lib/mongo/operation/read_preference.rb +10 -5
  76. data/lib/mongo/operation/result.rb +26 -2
  77. data/lib/mongo/operation/specifiable.rb +13 -1
  78. data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
  79. data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
  80. data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
  81. data/lib/mongo/operation/write/command/create_index.rb +6 -1
  82. data/lib/mongo/operation/write/command/delete.rb +28 -4
  83. data/lib/mongo/operation/write/command/drop_index.rb +6 -1
  84. data/lib/mongo/operation/write/command/insert.rb +22 -18
  85. data/lib/mongo/operation/write/command/update.rb +24 -9
  86. data/lib/mongo/operation/write/command/writable.rb +14 -1
  87. data/lib/mongo/operation/write/insert.rb +4 -1
  88. data/lib/mongo/operation/write/insert/result.rb +2 -2
  89. data/lib/mongo/operation/write/update.rb +7 -1
  90. data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
  91. data/lib/mongo/protocol.rb +3 -0
  92. data/lib/mongo/protocol/bit_vector.rb +2 -2
  93. data/lib/mongo/protocol/compressed.rb +135 -0
  94. data/lib/mongo/protocol/delete.rb +8 -6
  95. data/lib/mongo/protocol/get_more.rb +8 -6
  96. data/lib/mongo/protocol/insert.rb +8 -6
  97. data/lib/mongo/protocol/kill_cursors.rb +8 -6
  98. data/lib/mongo/protocol/message.rb +31 -3
  99. data/lib/mongo/protocol/msg.rb +172 -0
  100. data/lib/mongo/protocol/query.rb +26 -6
  101. data/lib/mongo/protocol/registry.rb +76 -0
  102. data/lib/mongo/protocol/reply.rb +10 -5
  103. data/lib/mongo/protocol/serializers.rb +224 -0
  104. data/lib/mongo/protocol/update.rb +8 -6
  105. data/lib/mongo/retryable.rb +4 -2
  106. data/lib/mongo/server.rb +6 -3
  107. data/lib/mongo/server/connectable.rb +1 -1
  108. data/lib/mongo/server/connection.rb +30 -8
  109. data/lib/mongo/server/description.rb +25 -1
  110. data/lib/mongo/server/description/features.rb +4 -1
  111. data/lib/mongo/server/monitor.rb +5 -0
  112. data/lib/mongo/server/monitor/connection.rb +50 -2
  113. data/lib/mongo/server_selector/nearest.rb +10 -4
  114. data/lib/mongo/server_selector/primary.rb +20 -0
  115. data/lib/mongo/server_selector/primary_preferred.rb +10 -4
  116. data/lib/mongo/server_selector/secondary.rb +10 -4
  117. data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
  118. data/lib/mongo/session.rb +180 -0
  119. data/lib/mongo/session/server_session.rb +73 -0
  120. data/lib/mongo/session/session_pool.rb +161 -0
  121. data/lib/mongo/uri.rb +11 -0
  122. data/lib/mongo/version.rb +1 -1
  123. data/mongo.gemspec +2 -1
  124. data/spec/mongo/auth/cr_spec.rb +12 -0
  125. data/spec/mongo/auth/ldap_spec.rb +2 -0
  126. data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
  127. data/spec/mongo/auth/scram_spec.rb +25 -1
  128. data/spec/mongo/auth/user/view_spec.rb +268 -76
  129. data/spec/mongo/auth/x509_spec.rb +2 -0
  130. data/spec/mongo/bulk_write_spec.rb +435 -5
  131. data/spec/mongo/client_spec.rb +356 -39
  132. data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
  133. data/spec/mongo/cluster_spec.rb +176 -0
  134. data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
  135. data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
  136. data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
  137. data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
  138. data/spec/mongo/collection/view/readable_spec.rb +3 -12
  139. data/spec/mongo/collection_spec.rb +1048 -42
  140. data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
  141. data/spec/mongo/cursor_spec.rb +2 -2
  142. data/spec/mongo/database_spec.rb +50 -1
  143. data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
  144. data/spec/mongo/grid/stream/read_spec.rb +2 -2
  145. data/spec/mongo/index/view_spec.rb +146 -8
  146. data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
  147. data/spec/mongo/operation/read/query_spec.rb +2 -1
  148. data/spec/mongo/operation/specifiable_spec.rb +2 -2
  149. data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
  150. data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
  151. data/spec/mongo/operation/write/command/update_spec.rb +93 -10
  152. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  153. data/spec/mongo/operation/write/insert_spec.rb +1 -1
  154. data/spec/mongo/operation/write/update_spec.rb +1 -1
  155. data/spec/mongo/protocol/compressed_spec.rb +66 -0
  156. data/spec/mongo/protocol/delete_spec.rb +14 -0
  157. data/spec/mongo/protocol/get_more_spec.rb +14 -0
  158. data/spec/mongo/protocol/insert_spec.rb +14 -0
  159. data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
  160. data/spec/mongo/protocol/msg_spec.rb +499 -0
  161. data/spec/mongo/protocol/query_spec.rb +45 -0
  162. data/spec/mongo/protocol/registry_spec.rb +31 -0
  163. data/spec/mongo/protocol/reply_spec.rb +14 -0
  164. data/spec/mongo/protocol/update_spec.rb +14 -0
  165. data/spec/mongo/retryable_spec.rb +6 -2
  166. data/spec/mongo/sdam_spec.rb +4 -0
  167. data/spec/mongo/server/connection_spec.rb +4 -2
  168. data/spec/mongo/server/description_spec.rb +28 -1
  169. data/spec/mongo/session/server_session_spec.rb +16 -0
  170. data/spec/mongo/session/session_pool_spec.rb +194 -0
  171. data/spec/mongo/uri_spec.rb +31 -2
  172. data/spec/spec_helper.rb +104 -0
  173. data/spec/support/authorization.rb +6 -1
  174. data/spec/support/crud.rb +3 -1
  175. data/spec/support/crud/write.rb +6 -1
  176. data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
  177. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
  178. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
  179. data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
  180. data/spec/support/sdam/rs/discover_passives.yml +2 -2
  181. data/spec/support/sdam/rs/discover_primary.yml +1 -1
  182. data/spec/support/sdam/rs/discover_secondary.yml +1 -1
  183. data/spec/support/sdam/rs/discovery.yml +4 -4
  184. data/spec/support/sdam/rs/equal_electionids.yml +1 -0
  185. data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
  186. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
  187. data/spec/support/sdam/rs/ls_timeout.yml +88 -0
  188. data/spec/support/sdam/rs/member_reconfig.yml +2 -2
  189. data/spec/support/sdam/rs/member_standalone.yml +2 -2
  190. data/spec/support/sdam/rs/new_primary.yml +2 -2
  191. data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
  192. data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
  193. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
  194. data/spec/support/sdam/rs/non_rs_member.yml +1 -1
  195. data/spec/support/sdam/rs/normalize_case.yml +1 -1
  196. data/spec/support/sdam/rs/null_election_id.yml +4 -0
  197. data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
  198. data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
  199. data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
  200. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
  201. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
  202. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
  203. data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
  204. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
  205. data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
  206. data/spec/support/sdam/rs/response_from_removed.yml +2 -2
  207. data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
  208. data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
  209. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
  210. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
  211. data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
  212. data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
  213. data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
  214. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
  215. data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
  216. data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
  217. data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
  218. data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
  219. data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
  220. data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  225. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  226. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  227. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  228. data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
  229. data/spec/support/sdam/single/not_ok_response.yml +1 -1
  230. data/spec/support/sdam/single/standalone_removed.yml +1 -1
  231. data/spec/support/sdam/single/unavailable_seed.yml +1 -1
  232. data/spec/support/server_discovery_and_monitoring.rb +4 -0
  233. data/spec/support/shared/session.rb +236 -0
  234. metadata +53 -15
  235. metadata.gz.sig +0 -0
data/spec/spec_helper.rb CHANGED
@@ -133,6 +133,35 @@ def single_seed?
133
133
  ADDRESSES.size == 1
134
134
  end
135
135
 
136
+ # For instances where behaviour is different on different versions, we need to
137
+ # determine in the specs if we are 3.6 or higher.
138
+ #
139
+ # @since 2.5.0
140
+ def op_msg_enabled?
141
+ $mongo_client ||= initialize_scanned_client!
142
+ $op_msg_enabled ||= $mongo_client.cluster.servers.first.features.op_msg_enabled?
143
+ end
144
+ alias :change_stream_enabled? :op_msg_enabled?
145
+ alias :sessions_enabled? :op_msg_enabled?
146
+
147
+ # Whether change streams can be tested. Change streams are available on server versions 3.6
148
+ # and higher and when connected to a replica set.
149
+ #
150
+ # @since 2.5.0
151
+ def test_change_streams?
152
+ !BSON::Environment.jruby? && change_stream_enabled? & replica_set?
153
+ end
154
+
155
+ # For instances where behaviour is different on different versions, we need to
156
+ # determine in the specs if we are 3.6 or higher.
157
+ #
158
+ # @since 2.5.0
159
+ def array_filters_enabled?
160
+ $mongo_client ||= initialize_scanned_client!
161
+ $array_filters_enabled ||= $mongo_client.cluster.servers.first.features.array_filters_enabled?
162
+ end
163
+
164
+
136
165
  # For instances where behaviour is different on different versions, we need to
137
166
  # determine in the specs if we are 3.4 or higher.
138
167
  #
@@ -183,6 +212,21 @@ def running_ssl?
183
212
  SSL
184
213
  end
185
214
 
215
+ # Is the test suite using compression.
216
+ #
217
+ # @since 2.5.0
218
+ def compression_enabled?
219
+ COMPRESSORS[:compressors]
220
+ end
221
+
222
+ # Is the test suite testing compression.
223
+ # Requires that the server supports compression and compression is used by the test client.
224
+ #
225
+ # @since 2.5.0
226
+ def testing_compression?
227
+ compression_enabled? && op_msg_enabled?
228
+ end
229
+
186
230
  alias :scram_sha_1_enabled? :list_command_enabled?
187
231
 
188
232
  # Depending on whether write commands are enabled, there are different documents that
@@ -217,5 +261,65 @@ def initialize_scanned_client!
217
261
  Mongo::Client.new(ADDRESSES, TEST_OPTIONS.merge(database: TEST_DB))
218
262
  end
219
263
 
264
+ # Test event subscriber.
265
+ #
266
+ # @since 2.5.0
267
+ class EventSubscriber
268
+
269
+ # The started events.
270
+ #
271
+ # @since 2.5.0
272
+ attr_reader :started_events
273
+
274
+ # The succeeded events.
275
+ #
276
+ # @since 2.5.0
277
+ attr_reader :succeeded_events
278
+
279
+ # The failed events.
280
+ #
281
+ # @since 2.5.0
282
+ attr_reader :failed_events
283
+
284
+ # Create the test event subscriber.
285
+ #
286
+ # @example Create the subscriber
287
+ # EventSubscriber.new
288
+ #
289
+ # @since 2.5.0
290
+ def initialize
291
+ @started_events = []
292
+ @succeeded_events = []
293
+ @failed_events = []
294
+ end
295
+
296
+ # Cache the succeeded event.
297
+ #
298
+ # @param [ Event ] event The event.
299
+ #
300
+ # @since 2.5.0
301
+ def succeeded(event)
302
+ @succeeded_events.push(event)
303
+ end
304
+
305
+ # Cache the started event.
306
+ #
307
+ # @param [ Event ] event The event.
308
+ #
309
+ # @since 2.5.0
310
+ def started(event)
311
+ @started_events.push(event)
312
+ end
313
+
314
+ # Cache the failed event.
315
+ #
316
+ # @param [ Event ] event The event.
317
+ #
318
+ # @since 2.5.0
319
+ def failed(event)
320
+ @failed_events.push(event)
321
+ end
322
+ end
323
+
220
324
  # require all shared examples
221
325
  Dir['./spec/support/shared/*.rb'].sort.each { |file| require file }
@@ -62,6 +62,11 @@ INVALID_WRITE_CONCERN = { w: 4 }
62
62
  # @since 2.0.3
63
63
  SSL = (ENV['SSL'] == 'ssl') || (ENV['SSL_ENABLED'] == 'true')
64
64
 
65
+ # What compressor to use, if any.
66
+ #
67
+ # @since 2.5.0
68
+ COMPRESSORS = ENV['COMPRESSORS'] ? { compressors: ENV['COMPRESSORS'].split(',') } : {}
69
+
65
70
  # SSL options.
66
71
  #
67
72
  # @since 2.1.0
@@ -87,7 +92,7 @@ BASE_OPTIONS = {
87
92
  # Options for test suite clients.
88
93
  #
89
94
  # @since 2.0.3
90
- TEST_OPTIONS = BASE_OPTIONS.merge(CONNECT).merge(SSL_OPTIONS)
95
+ TEST_OPTIONS = BASE_OPTIONS.merge(CONNECT).merge(SSL_OPTIONS).merge(COMPRESSORS)
91
96
 
92
97
  # The root user name.
93
98
  #
data/spec/support/crud.rb CHANGED
@@ -114,7 +114,9 @@ module Mongo
114
114
 
115
115
  def lower_bound_satisfied?(client)
116
116
  if @min_server_version
117
- if @min_server_version >= '3.4'
117
+ if @min_server_version >= '3.6'
118
+ client.cluster.next_primary.features.array_filters_enabled?
119
+ elsif @min_server_version >= '3.4'
118
120
  client.cluster.next_primary.features.collation_enabled?
119
121
  elsif @min_server_version >= '2.6'
120
122
  client.cluster.next_primary.features.write_command_enabled?
@@ -48,7 +48,8 @@ module Mongo
48
48
  :upsert => 'upsert',
49
49
  :ordered => 'ordered',
50
50
  :write_concern => 'writeConcern',
51
- :collation => 'collation'
51
+ :collation => 'collation',
52
+ :array_filters => 'arrayFilters'
52
53
  }.freeze
53
54
 
54
55
  # The operation name.
@@ -199,6 +200,10 @@ module Mongo
199
200
  arguments['filter']
200
201
  end
201
202
 
203
+ def array_filters
204
+ arguments['arrayFilters']
205
+ end
206
+
202
207
  def requests
203
208
  arguments['requests'].map do |request|
204
209
  case request.keys.first
@@ -0,0 +1,69 @@
1
+ data:
2
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
3
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
4
+ minServerVersion: '3.6'
5
+
6
+ tests:
7
+ -
8
+ description: "FindOneAndUpdate when no document matches arrayFilters"
9
+ operation:
10
+ name: findOneAndUpdate
11
+ arguments:
12
+ filter: {}
13
+ update:
14
+ $set: {"y.$[i].b": 2}
15
+ arrayFilters:
16
+ - {i.b: 4}
17
+
18
+ outcome:
19
+ result:
20
+ _id: 1
21
+ y:
22
+ - {b: 3}
23
+ - {b: 1}
24
+ collection:
25
+ data:
26
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
27
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
28
+ -
29
+ description: "FindOneAndUpdate when one document matches arrayFilters"
30
+ operation:
31
+ name: findOneAndUpdate
32
+ arguments:
33
+ filter: {}
34
+ update:
35
+ $set: {"y.$[i].b": 2}
36
+ arrayFilters:
37
+ - {i.b: 3}
38
+
39
+ outcome:
40
+ result:
41
+ _id: 1
42
+ y:
43
+ - {b: 3}
44
+ - {b: 1}
45
+ collection:
46
+ data:
47
+ - {_id: 1, y: [{b: 2}, {b: 1}]}
48
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
49
+ -
50
+ description: "FindOneAndUpdate when multiple documents match arrayFilters"
51
+ operation:
52
+ name: findOneAndUpdate
53
+ arguments:
54
+ filter: {}
55
+ update:
56
+ $set: {"y.$[i].b": 2}
57
+ arrayFilters:
58
+ - {i.b: 1}
59
+
60
+ outcome:
61
+ result:
62
+ _id: 1
63
+ y:
64
+ - {b: 3}
65
+ - {b: 1}
66
+ collection:
67
+ data:
68
+ - {_id: 1, y: [{b: 3}, {b: 2}]}
69
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
@@ -0,0 +1,63 @@
1
+ data:
2
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
3
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
4
+ minServerVersion: '3.6'
5
+
6
+ tests:
7
+ -
8
+ description: "UpdateMany when no documents match arrayFilters"
9
+ operation:
10
+ name: "updateMany"
11
+ arguments:
12
+ filter: {}
13
+ update:
14
+ $set: {"y.$[i].b": 2}
15
+ arrayFilters:
16
+ - {i.b: 4}
17
+
18
+ outcome:
19
+ result:
20
+ matchedCount: 2
21
+ modifiedCount: 0
22
+ collection:
23
+ data:
24
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
25
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
26
+ -
27
+ description: "UpdateMany when one document matches arrayFilters"
28
+ operation:
29
+ name: "updateMany"
30
+ arguments:
31
+ filter: {}
32
+ update:
33
+ $set: {"y.$[i].b": 2}
34
+ arrayFilters:
35
+ - {i.b: 3}
36
+
37
+ outcome:
38
+ result:
39
+ matchedCount: 2
40
+ modifiedCount: 1
41
+ collection:
42
+ data:
43
+ - {_id: 1, y: [{b: 2}, {b: 1}]}
44
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
45
+ -
46
+ description: "UpdateMany when multiple documents match arrayFilters"
47
+ operation:
48
+ name: "updateMany"
49
+ arguments:
50
+ filter: {}
51
+ update:
52
+ $set: {"y.$[i].b": 2}
53
+ arrayFilters:
54
+ - {i.b: 1}
55
+
56
+ outcome:
57
+ result:
58
+ matchedCount: 2
59
+ modifiedCount: 2
60
+ collection:
61
+ data:
62
+ - {_id: 1, y: [{b: 3}, {b: 2}]}
63
+ - {_id: 2, y: [{b: 0}, {b: 2}]}
@@ -0,0 +1,109 @@
1
+ data:
2
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
3
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
4
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 1}] }]}
5
+ minServerVersion: '3.6'
6
+
7
+ tests:
8
+ -
9
+ description: "UpdateOne when no document matches arrayFilters"
10
+ operation:
11
+ name: "updateOne"
12
+ arguments:
13
+ filter: {}
14
+ update:
15
+ $set: {"y.$[i].b": 2}
16
+ arrayFilters:
17
+ - {i.b: 4}
18
+
19
+ outcome:
20
+ result:
21
+ matchedCount: 1
22
+ modifiedCount: 0
23
+ collection:
24
+ data:
25
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
26
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
27
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 1}] }]}
28
+ -
29
+ description: "UpdateOne when one document matches arrayFilters"
30
+ operation:
31
+ name: "updateOne"
32
+ arguments:
33
+ filter: {}
34
+ update:
35
+ $set: {"y.$[i].b": 2}
36
+ arrayFilters:
37
+ - {i.b: 3}
38
+
39
+ outcome:
40
+ result:
41
+ matchedCount: 1
42
+ modifiedCount: 1
43
+ collection:
44
+ data:
45
+ - {_id: 1, y: [{b: 2}, {b: 1}]}
46
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
47
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 1}] }]}
48
+ -
49
+ description: "UpdateOne when multiple documents match arrayFilters"
50
+ operation:
51
+ name: "updateOne"
52
+ arguments:
53
+ filter: {}
54
+ update:
55
+ $set: {"y.$[i].b": 2}
56
+ arrayFilters:
57
+ - {i.b: 1}
58
+
59
+ outcome:
60
+ result:
61
+ matchedCount: 1
62
+ modifiedCount: 1
63
+ collection:
64
+ data:
65
+ - {_id: 1, y: [{b: 3}, {b: 2}]}
66
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
67
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 1}] }]}
68
+ -
69
+ description: "UpdateOne when no documents match multiple arrayFilters"
70
+ operation:
71
+ name: "updateOne"
72
+ arguments:
73
+ filter: {_id: 3}
74
+ update:
75
+ $set: {"y.$[i].c.$[j].d": 0}
76
+ arrayFilters:
77
+ - {i.b: 5}
78
+ - {j.d: 3}
79
+
80
+ outcome:
81
+ result:
82
+ matchedCount: 1
83
+ modifiedCount: 0
84
+ collection:
85
+ data:
86
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
87
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
88
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 1}] }]}
89
+ -
90
+ description: "UpdateOne when one document matches multiple arrayFilters"
91
+ operation:
92
+ name: "updateOne"
93
+ arguments:
94
+ filter: {_id: 3}
95
+ update:
96
+ $set: {"y.$[i].c.$[j].d": 0}
97
+ arrayFilters:
98
+ - {i.b: 5}
99
+ - {j.d: 1}
100
+
101
+ outcome:
102
+ result:
103
+ matchedCount: 1
104
+ modifiedCount: 1
105
+ collection:
106
+ data:
107
+ - {_id: 1, y: [{b: 3}, {b: 1}]}
108
+ - {_id: 2, y: [{b: 0}, {b: 1}]}
109
+ - {_id: 3, y: [{b: 5, c: [{d: 2}, {d: 0}] }]}
@@ -33,8 +33,8 @@ phases: [
33
33
  setName:
34
34
  }
35
35
  },
36
-
37
36
  topologyType: "ReplicaSetWithPrimary",
37
+ logicalSessionTimeoutMinutes: null,
38
38
  setName: "rs"
39
39
  }
40
40
  }
@@ -33,8 +33,8 @@ phases: [
33
33
  setName:
34
34
  }
35
35
  },
36
-
37
36
  topologyType: "ReplicaSetWithPrimary",
37
+ logicalSessionTimeoutMinutes: null,
38
38
  setName: "rs"
39
39
  }
40
40
  },
@@ -69,8 +69,8 @@ phases: [
69
69
  setName: "rs"
70
70
  }
71
71
  },
72
-
73
72
  topologyType: "ReplicaSetWithPrimary",
73
+ logicalSessionTimeoutMinutes: null,
74
74
  setName: "rs"
75
75
  }
76
76
  }