mongo 2.16.4 → 2.17.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.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +1 -1
  4. data/lib/mongo/auth/aws/request.rb +0 -1
  5. data/lib/mongo/client.rb +4 -0
  6. data/lib/mongo/collection/view/aggregation.rb +62 -17
  7. data/lib/mongo/collection/view/builder/aggregation.rb +11 -13
  8. data/lib/mongo/collection/view/builder/map_reduce.rb +5 -8
  9. data/lib/mongo/collection/view/change_stream.rb +7 -3
  10. data/lib/mongo/collection/view/iterable.rb +3 -20
  11. data/lib/mongo/collection/view/map_reduce.rb +3 -14
  12. data/lib/mongo/collection/view/readable.rb +24 -1
  13. data/lib/mongo/collection/view/writable.rb +23 -0
  14. data/lib/mongo/collection/view.rb +0 -1
  15. data/lib/mongo/collection.rb +21 -1
  16. data/lib/mongo/database/view.rb +4 -2
  17. data/lib/mongo/database.rb +6 -6
  18. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  19. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  20. data/lib/mongo/error.rb +2 -0
  21. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  22. data/lib/mongo/operation/find/builder/command.rb +1 -0
  23. data/lib/mongo/operation/result.rb +6 -0
  24. data/lib/mongo/operation/shared/executable.rb +4 -0
  25. data/lib/mongo/operation/shared/sessions_supported.rb +18 -2
  26. data/lib/mongo/operation/update/op_msg.rb +2 -1
  27. data/lib/mongo/query_cache.rb +2 -12
  28. data/lib/mongo/server/description/features.rb +3 -1
  29. data/lib/mongo/server/monitor/connection.rb +4 -10
  30. data/lib/mongo/server_selector/base.rb +26 -4
  31. data/lib/mongo/session.rb +19 -0
  32. data/lib/mongo/socket/ocsp_cache.rb +2 -3
  33. data/lib/mongo/socket.rb +1 -5
  34. data/lib/mongo/utils.rb +0 -6
  35. data/lib/mongo/version.rb +1 -1
  36. data/mongo.gemspec +1 -1
  37. data/spec/integration/query_cache_spec.rb +0 -159
  38. data/spec/integration/read_preference_spec.rb +16 -12
  39. data/spec/integration/sdam_events_spec.rb +0 -40
  40. data/spec/lite_spec_helper.rb +0 -7
  41. data/spec/mongo/collection/view/aggregation_spec.rb +71 -95
  42. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  43. data/spec/mongo/collection/view/map_reduce_spec.rb +14 -17
  44. data/spec/mongo/collection/view/readable_spec.rb +0 -56
  45. data/spec/mongo/operation/read_preference_op_msg_spec.rb +24 -1
  46. data/spec/mongo/query_cache_spec.rb +0 -165
  47. data/spec/mongo/server_selector_spec.rb +136 -15
  48. data/spec/mongo/socket/ssl_spec.rb +26 -58
  49. data/spec/mongo/utils_spec.rb +0 -14
  50. data/spec/runners/auth.rb +1 -1
  51. data/spec/runners/change_streams/spec.rb +1 -1
  52. data/spec/runners/cmap.rb +1 -1
  53. data/spec/runners/command_monitoring.rb +1 -1
  54. data/spec/runners/connection_string.rb +1 -1
  55. data/spec/runners/crud/spec.rb +3 -1
  56. data/spec/runners/crud/verifier.rb +1 -2
  57. data/spec/runners/gridfs.rb +1 -1
  58. data/spec/runners/read_write_concern_document.rb +1 -1
  59. data/spec/runners/sdam.rb +1 -1
  60. data/spec/runners/server_selection.rb +1 -1
  61. data/spec/runners/server_selection_rtt.rb +1 -1
  62. data/spec/runners/unified/assertions.rb +3 -1
  63. data/spec/runners/unified/crud_operations.rb +77 -23
  64. data/spec/runners/unified/ddl_operations.rb +29 -1
  65. data/spec/runners/unified/entity_map.rb +3 -3
  66. data/spec/runners/unified/support_operations.rb +6 -1
  67. data/spec/runners/unified/test.rb +15 -3
  68. data/spec/runners/unified/test_group.rb +1 -1
  69. data/spec/shared/share/Dockerfile.erb +3 -3
  70. data/spec/shared/shlib/server.sh +1 -1
  71. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  72. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  73. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  74. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +91 -0
  75. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +89 -0
  76. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  77. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +88 -0
  78. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  79. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  80. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +103 -0
  81. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +98 -0
  82. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  83. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  84. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  85. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  86. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  87. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  88. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  89. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  90. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  91. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  92. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  93. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  94. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  95. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  96. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  97. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  98. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  99. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  100. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  101. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  102. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  103. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  104. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  105. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  106. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  107. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  108. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  109. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  110. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  111. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +69 -0
  112. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  113. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  114. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  115. data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
  116. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  117. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  118. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  119. data/spec/support/utils.rb +0 -31
  120. data.tar.gz.sig +0 -0
  121. metadata +1084 -1058
  122. metadata.gz.sig +0 -0
  123. data/spec/integration/find_options_spec.rb +0 -227
@@ -7,7 +7,13 @@ module Unified
7
7
 
8
8
  def list_databases(op)
9
9
  client = entities.get(:client, op.use!('object'))
10
- client.list_databases
10
+ use_arguments(op) do |args|
11
+ opts = {}
12
+ if session = args.use('session')
13
+ opts[:session] = entities.get(:session, session)
14
+ end
15
+ client.list_databases({}, false, **opts)
16
+ end
11
17
  end
12
18
 
13
19
  def create_collection(op)
@@ -28,6 +34,17 @@ module Unified
28
34
  end
29
35
  end
30
36
 
37
+ def list_collections(op)
38
+ database = entities.get(:database, op.use!('object'))
39
+ use_arguments(op) do |args|
40
+ opts = {}
41
+ if session = args.use('session')
42
+ opts[:session] = entities.get(:session, session)
43
+ end
44
+ database.list_collections(**opts)
45
+ end
46
+ end
47
+
31
48
  def drop_collection(op)
32
49
  database = entities.get(:database, op.use!('object'))
33
50
  use_arguments(op) do |args|
@@ -58,6 +75,17 @@ module Unified
58
75
  assert_collection_exists(op, false)
59
76
  end
60
77
 
78
+ def list_indexes(op)
79
+ collection = entities.get(:collection, op.use!('object'))
80
+ use_arguments(op) do |args|
81
+ opts = {}
82
+ if session = args.use('session')
83
+ opts[:session] = entities.get(:session, session)
84
+ end
85
+ collection.indexes(**opts).to_a
86
+ end
87
+ end
88
+
61
89
  def create_index(op)
62
90
  collection = entities.get(:collection, op.use!('object'))
63
91
  use_arguments(op) do |args|
@@ -3,6 +3,8 @@
3
3
 
4
4
  module Unified
5
5
  class EntityMap
6
+ extend Forwardable
7
+
6
8
  def initialize
7
9
  @map = {}
8
10
  end
@@ -35,8 +37,6 @@ module Unified
35
37
  raise Error::EntityMissing, "There is no #{id} known"
36
38
  end
37
39
 
38
- def [](type)
39
- @map[type]
40
- end
40
+ def_delegators :@map, :[], :fetch
41
41
  end
42
42
  end
@@ -13,7 +13,12 @@ module Unified
13
13
 
14
14
  cmd = args.use!('command')
15
15
 
16
- database.command(cmd)
16
+ opts = {}
17
+ if session = args.use('session')
18
+ opts[:session] = entities.get(:session, session)
19
+ end
20
+
21
+ database.command(cmd, **opts)
17
22
  end
18
23
  end
19
24
 
@@ -160,13 +160,24 @@ module Unified
160
160
  end
161
161
  when 'database'
162
162
  client = entities.get(:client, spec.use!('client'))
163
- client.use(spec.use!('databaseName')).database
163
+ opts = Utils.snakeize_hash(spec.use('databaseOptions') || {})
164
+ .merge(database: spec.use!('databaseName'))
165
+ if opts.key?(:read_preference)
166
+ opts[:read] = opts.delete(:read_preference)
167
+ if opts[:read].key?(:max_staleness_seconds)
168
+ opts[:read][:max_staleness] = opts[:read].delete(:max_staleness_seconds)
169
+ end
170
+ end
171
+ client.with(opts).database
164
172
  when 'collection'
165
173
  database = entities.get(:database, spec.use!('database'))
166
174
  # TODO verify
167
175
  opts = Utils.snakeize_hash(spec.use('collectionOptions') || {})
168
176
  if opts.key?(:read_preference)
169
177
  opts[:read] = opts.delete(:read_preference)
178
+ if opts[:read].key?(:max_staleness_seconds)
179
+ opts[:read][:max_staleness] = opts[:read].delete(:max_staleness_seconds)
180
+ end
170
181
  end
171
182
  database[spec.use!('collectionName'), opts]
172
183
  when 'bucket'
@@ -195,7 +206,8 @@ module Unified
195
206
  def set_initial_data
196
207
  @spec['initialData']&.each do |entity_spec|
197
208
  spec = UsingHash[entity_spec]
198
- collection = root_authorized_client.use(spec.use!('databaseName'))[spec.use!('collectionName')]
209
+ collection = root_authorized_client.with(write_concern: {w: :majority}).
210
+ use(spec.use!('databaseName'))[spec.use!('collectionName')]
199
211
  collection.drop
200
212
  docs = spec.use!('documents')
201
213
  if docs.any?
@@ -268,7 +280,7 @@ module Unified
268
280
  end
269
281
  if expected_error = op.use('expectError')
270
282
  begin
271
- send(method_name, op)
283
+ public_send(method_name, op)
272
284
  rescue Mongo::Error, BSON::String::IllegalKey => e
273
285
  if expected_error.use('isClientError')
274
286
  # isClientError doesn't actually mean a client error.
@@ -6,7 +6,7 @@ module Unified
6
6
  class TestGroup
7
7
  def initialize(path, **opts)
8
8
  if String === path
9
- data = ::Utils.load_spec_yaml_file(path)
9
+ data = YAML.load(File.read(path))
10
10
  else
11
11
  data = path
12
12
  end
@@ -233,13 +233,13 @@ CFG
233
233
  # Current virtualenv fails with
234
234
  # https://github.com/pypa/virtualenv/issues/1630
235
235
  <% if distro =~ /ubuntu2004/ %>
236
- RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
236
+ RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
237
237
  <% else %>
238
- RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
238
+ RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
239
239
  <% end %>
240
240
 
241
241
  RUN pip --version && \
242
- pip install 'mtools-legacy[mlaunch]==1.5.5'
242
+ pip install mtools-legacy[mlaunch]
243
243
 
244
244
  <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
245
245
  # ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
@@ -71,7 +71,7 @@ install_mlaunch_virtualenv() {
71
71
  venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
72
  python2 -m virtualenv -p python2 $venvpath
73
73
  . $venvpath/bin/activate
74
- pip install 'mtools-legacy[mlaunch]==1.5.5'
74
+ pip install 'mtools-legacy[mlaunch]'
75
75
  fi
76
76
  }
77
77
 
@@ -0,0 +1,138 @@
1
+ description: "aggregate-let"
2
+
3
+ schemaVersion: "1.4"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client0 client0
8
+ observeEvents: [ commandStartedEvent ]
9
+ - database:
10
+ id: &database0 database0
11
+ client: *client0
12
+ databaseName: &database0Name crud-tests
13
+ - collection:
14
+ id: &collection0 collection0
15
+ database: *database0
16
+ collectionName: &collection0Name coll0
17
+ - collection:
18
+ id: &collection1 collection1
19
+ database: *database0
20
+ collectionName: &collection1Name coll1
21
+
22
+ initialData: &initialData
23
+ - collectionName: *collection0Name
24
+ databaseName: *database0Name
25
+ documents:
26
+ - { _id: 1 }
27
+ - collectionName: *collection1Name
28
+ databaseName: *database0Name
29
+ documents: [ ]
30
+
31
+ tests:
32
+ - description: "Aggregate with let option"
33
+ runOnRequirements:
34
+ - minServerVersion: "5.0"
35
+ operations:
36
+ - name: aggregate
37
+ object: *collection0
38
+ arguments:
39
+ pipeline: &pipeline0
40
+ # $match takes a query expression, so $expr is necessary to utilize
41
+ # an aggregate expression context and access "let" variables.
42
+ - $match: { $expr: { $eq: ["$_id", "$$id"] } }
43
+ - $project: { _id: 0, x: "$$x", y: "$$y", rand: "$$rand" }
44
+ # Values in "let" must be constant or closed expressions that do not
45
+ # depend on document values. This test demonstrates a basic constant
46
+ # value, a value wrapped with $literal (to avoid expression parsing),
47
+ # and a closed expression (e.g. $rand).
48
+ let: &let0
49
+ id: 1
50
+ x: foo
51
+ y: { $literal: "$bar" }
52
+ rand: { $rand: {} }
53
+ expectResult:
54
+ - { x: "foo", y: "$bar", rand: { $$type: "double" } }
55
+ expectEvents:
56
+ - client: *client0
57
+ events:
58
+ - commandStartedEvent:
59
+ command:
60
+ aggregate: *collection0Name
61
+ pipeline: *pipeline0
62
+ let: *let0
63
+
64
+ - description: "Aggregate with let option unsupported (server-side error)"
65
+ runOnRequirements:
66
+ - minServerVersion: "2.6.0"
67
+ maxServerVersion: "4.4.99"
68
+ operations:
69
+ - name: aggregate
70
+ object: *collection0
71
+ arguments:
72
+ pipeline: &pipeline1
73
+ - $match: { _id: 1 }
74
+ let: &let1
75
+ x: foo
76
+ expectError:
77
+ # Older server versions may not report an error code, but the error
78
+ # message is consistent between 2.6.x and 4.4.x server versions.
79
+ errorContains: "unrecognized field 'let'"
80
+ isClientError: false
81
+ expectEvents:
82
+ - client: *client0
83
+ events:
84
+ - commandStartedEvent:
85
+ command:
86
+ aggregate: *collection0Name
87
+ pipeline: *pipeline1
88
+ let: *let1
89
+
90
+ - description: "Aggregate to collection with let option"
91
+ runOnRequirements:
92
+ - minServerVersion: "5.0"
93
+ serverless: "forbid"
94
+ operations:
95
+ - name: aggregate
96
+ object: *collection0
97
+ arguments:
98
+ pipeline: &pipeline2
99
+ - $match: { $expr: { $eq: ["$_id", "$$id"] } }
100
+ - $project: { _id: 1 }
101
+ - $out: *collection1Name
102
+ let: &let2
103
+ id: 1
104
+ expectEvents:
105
+ - client: *client0
106
+ events:
107
+ - commandStartedEvent:
108
+ command:
109
+ aggregate: *collection0Name
110
+ pipeline: *pipeline2
111
+ let: *let2
112
+ outcome:
113
+ - collectionName: *collection1Name
114
+ databaseName: *database0Name
115
+ documents:
116
+ - { _id: 1 }
117
+
118
+ - description: "Aggregate to collection with let option unsupported (server-side error)"
119
+ runOnRequirements:
120
+ - minServerVersion: "2.6.0"
121
+ maxServerVersion: "4.4.99"
122
+ operations:
123
+ - name: aggregate
124
+ object: *collection0
125
+ arguments:
126
+ pipeline: *pipeline2
127
+ let: *let2
128
+ expectError:
129
+ errorContains: "unrecognized field 'let'"
130
+ isClientError: false
131
+ expectEvents:
132
+ - client: *client0
133
+ events:
134
+ - commandStartedEvent:
135
+ command:
136
+ aggregate: *collection0Name
137
+ pipeline: *pipeline2
138
+ let: *let2
@@ -0,0 +1,155 @@
1
+ description: aggregate-write-readPreference
2
+
3
+ schemaVersion: '1.4'
4
+
5
+ runOnRequirements:
6
+ # 3.6+ non-standalone is needed to utilize $readPreference in OP_MSG
7
+ - minServerVersion: "3.6"
8
+ topologies: [ replicaset, sharded, load-balanced ]
9
+
10
+ _yamlAnchors:
11
+ readConcern: &readConcern
12
+ level: &readConcernLevel "local"
13
+ writeConcern: &writeConcern
14
+ w: &writeConcernW 1
15
+
16
+ createEntities:
17
+ - client:
18
+ id: &client0 client0
19
+ observeEvents:
20
+ - commandStartedEvent
21
+ # Used to test that read and write concerns are still inherited
22
+ uriOptions:
23
+ readConcernLevel: *readConcernLevel
24
+ w: *writeConcernW
25
+ - database:
26
+ id: &database0 database0
27
+ client: *client0
28
+ databaseName: &database0Name db0
29
+ - collection:
30
+ id: &collection0 collection0
31
+ database: *database0
32
+ collectionName: &collection0Name coll0
33
+ collectionOptions:
34
+ readPreference: &readPreference
35
+ # secondaryPreferred is specified for compatibility with clusters that
36
+ # may not have a secondary (e.g. each shard is only a primary).
37
+ mode: secondaryPreferred
38
+ # maxStalenessSeconds is specified to ensure that drivers forward the
39
+ # read preference to mongos or a load balancer. That would not be the
40
+ # case with only secondaryPreferred.
41
+ maxStalenessSeconds: 600
42
+ - collection:
43
+ id: &collection1 collection1
44
+ database: *database0
45
+ collectionName: &collection1Name coll1
46
+
47
+ initialData:
48
+ - collectionName: *collection0Name
49
+ databaseName: *database0Name
50
+ documents:
51
+ - { _id: 1, x: 11 }
52
+ - { _id: 2, x: 22 }
53
+ - { _id: 3, x: 33 }
54
+ - collectionName: *collection1Name
55
+ databaseName: *database0Name
56
+ documents: []
57
+
58
+ tests:
59
+ - description: "Aggregate with $out includes read preference for 5.0+ server"
60
+ runOnRequirements:
61
+ - minServerVersion: "5.0"
62
+ serverless: "forbid"
63
+ operations:
64
+ - object: *collection0
65
+ name: aggregate
66
+ arguments:
67
+ pipeline: &outPipeline
68
+ - { $match: { _id: { $gt: 1 } } }
69
+ - { $sort: { x: 1 } }
70
+ - { $out: *collection1Name }
71
+ expectEvents:
72
+ - client: *client0
73
+ events:
74
+ - commandStartedEvent:
75
+ command:
76
+ aggregate: *collection0Name
77
+ pipeline: *outPipeline
78
+ $readPreference: *readPreference
79
+ readConcern: *readConcern
80
+ writeConcern: *writeConcern
81
+ outcome: &outcome
82
+ - collectionName: *collection1Name
83
+ databaseName: *database0Name
84
+ documents:
85
+ - { _id: 2, x: 22 }
86
+ - { _id: 3, x: 33 }
87
+
88
+ - description: "Aggregate with $out omits read preference for pre-5.0 server"
89
+ runOnRequirements:
90
+ # MongoDB 4.2 introduced support for read concerns and write stages.
91
+ # Pre-4.2 servers may allow a "local" read concern anyway, but some
92
+ # drivers may avoid inheriting a client-level read concern for pre-4.2.
93
+ - minServerVersion: "4.2"
94
+ maxServerVersion: "4.4.99"
95
+ serverless: "forbid"
96
+ operations:
97
+ - object: *collection0
98
+ name: aggregate
99
+ arguments:
100
+ pipeline: *outPipeline
101
+ expectEvents:
102
+ - client: *client0
103
+ events:
104
+ - commandStartedEvent:
105
+ command:
106
+ aggregate: *collection0Name
107
+ pipeline: *outPipeline
108
+ $readPreference: { $$exists: false }
109
+ readConcern: *readConcern
110
+ writeConcern: *writeConcern
111
+ outcome: *outcome
112
+
113
+ - description: "Aggregate with $merge includes read preference for 5.0+ server"
114
+ runOnRequirements:
115
+ - minServerVersion: "5.0"
116
+ operations:
117
+ - object: *collection0
118
+ name: aggregate
119
+ arguments:
120
+ pipeline: &mergePipeline
121
+ - { $match: { _id: { $gt: 1 } } }
122
+ - { $sort: { x: 1 } }
123
+ - { $merge: { into: *collection1Name } }
124
+ expectEvents:
125
+ - client: *client0
126
+ events:
127
+ - commandStartedEvent:
128
+ command:
129
+ aggregate: *collection0Name
130
+ pipeline: *mergePipeline
131
+ $readPreference: *readPreference
132
+ readConcern: *readConcern
133
+ writeConcern: *writeConcern
134
+ outcome: *outcome
135
+
136
+ - description: "Aggregate with $merge omits read preference for pre-5.0 server"
137
+ runOnRequirements:
138
+ - minServerVersion: "4.2"
139
+ maxServerVersion: "4.4.99"
140
+ operations:
141
+ - object: *collection0
142
+ name: aggregate
143
+ arguments:
144
+ pipeline: *mergePipeline
145
+ expectEvents:
146
+ - client: *client0
147
+ events:
148
+ - commandStartedEvent:
149
+ command:
150
+ aggregate: *collection0Name
151
+ pipeline: *mergePipeline
152
+ $readPreference: { $$exists: false }
153
+ readConcern: *readConcern
154
+ writeConcern: *writeConcern
155
+ outcome: *outcome
@@ -0,0 +1,151 @@
1
+ description: db-aggregate-write-readPreference
2
+
3
+ schemaVersion: '1.4'
4
+
5
+ runOnRequirements:
6
+ # 3.6+ non-standalone is needed to utilize $readPreference in OP_MSG.
7
+ # Serverless does not support $listLocalSessions and $currentOp stages, and
8
+ # mongos does not allow combining them with $out or $merge.
9
+ - minServerVersion: "3.6"
10
+ topologies: [ replicaset ]
11
+ serverless: forbid
12
+
13
+ _yamlAnchors:
14
+ readConcern: &readConcern
15
+ level: &readConcernLevel "local"
16
+ writeConcern: &writeConcern
17
+ w: &writeConcernW 1
18
+
19
+ createEntities:
20
+ - client:
21
+ id: &client0 client0
22
+ observeEvents:
23
+ - commandStartedEvent
24
+ # Used to test that read and write concerns are still inherited
25
+ uriOptions:
26
+ readConcernLevel: *readConcernLevel
27
+ w: *writeConcernW
28
+ - database:
29
+ id: &database0 database0
30
+ client: *client0
31
+ databaseName: &database0Name db0
32
+ databaseOptions:
33
+ readPreference: &readPreference
34
+ # secondaryPreferred is specified for compatibility with clusters that
35
+ # may not have a secondary (e.g. each shard is only a primary).
36
+ mode: secondaryPreferred
37
+ # maxStalenessSeconds is specified to ensure that drivers forward the
38
+ # read preference to mongos or a load balancer. That would not be the
39
+ # case with only secondaryPreferred.
40
+ maxStalenessSeconds: 600
41
+ - collection:
42
+ id: &collection0 collection0
43
+ database: *database0
44
+ collectionName: &collection0Name coll0
45
+
46
+ initialData:
47
+ - collectionName: *collection0Name
48
+ databaseName: *database0Name
49
+ documents: []
50
+
51
+ tests:
52
+ - description: "Database-level aggregate with $out includes read preference for 5.0+ server"
53
+ runOnRequirements:
54
+ - minServerVersion: "5.0"
55
+ serverless: "forbid"
56
+ operations:
57
+ - object: *database0
58
+ name: aggregate
59
+ arguments:
60
+ pipeline: &outPipeline
61
+ - { $listLocalSessions: {} }
62
+ - { $limit: 1 }
63
+ - { $addFields: { _id: 1 } }
64
+ - { $project: { _id: 1 } }
65
+ - { $out: *collection0Name }
66
+ expectEvents:
67
+ - client: *client0
68
+ events:
69
+ - commandStartedEvent:
70
+ command:
71
+ aggregate: 1
72
+ pipeline: *outPipeline
73
+ $readPreference: *readPreference
74
+ readConcern: *readConcern
75
+ writeConcern: *writeConcern
76
+ outcome: &outcome
77
+ - collectionName: *collection0Name
78
+ databaseName: *database0Name
79
+ documents:
80
+ - { _id: 1 }
81
+
82
+ - description: "Database-level aggregate with $out omits read preference for pre-5.0 server"
83
+ runOnRequirements:
84
+ # MongoDB 4.2 introduced support for read concerns and write stages.
85
+ # Pre-4.2 servers may allow a "local" read concern anyway, but some
86
+ # drivers may avoid inheriting a client-level read concern for pre-4.2.
87
+ - minServerVersion: "4.2"
88
+ maxServerVersion: "4.4.99"
89
+ serverless: "forbid"
90
+ operations:
91
+ - object: *database0
92
+ name: aggregate
93
+ arguments:
94
+ pipeline: *outPipeline
95
+ expectEvents:
96
+ - client: *client0
97
+ events:
98
+ - commandStartedEvent:
99
+ command:
100
+ aggregate: 1
101
+ pipeline: *outPipeline
102
+ $readPreference: { $$exists: false }
103
+ readConcern: *readConcern
104
+ writeConcern: *writeConcern
105
+ outcome: *outcome
106
+
107
+ - description: "Database-level aggregate with $merge includes read preference for 5.0+ server"
108
+ runOnRequirements:
109
+ - minServerVersion: "5.0"
110
+ operations:
111
+ - object: *database0
112
+ name: aggregate
113
+ arguments:
114
+ pipeline: &mergePipeline
115
+ - { $listLocalSessions: {} }
116
+ - { $limit: 1 }
117
+ - { $addFields: { _id: 1 } }
118
+ - { $project: { _id: 1 } }
119
+ - { $merge: { into: *collection0Name } }
120
+ expectEvents:
121
+ - client: *client0
122
+ events:
123
+ - commandStartedEvent:
124
+ command:
125
+ aggregate: 1
126
+ pipeline: *mergePipeline
127
+ $readPreference: *readPreference
128
+ readConcern: *readConcern
129
+ writeConcern: *writeConcern
130
+ outcome: *outcome
131
+
132
+ - description: "Database-level aggregate with $merge omits read preference for pre-5.0 server"
133
+ runOnRequirements:
134
+ - minServerVersion: "4.2"
135
+ maxServerVersion: "4.4.99"
136
+ operations:
137
+ - object: *database0
138
+ name: aggregate
139
+ arguments:
140
+ pipeline: *mergePipeline
141
+ expectEvents:
142
+ - client: *client0
143
+ events:
144
+ - commandStartedEvent:
145
+ command:
146
+ aggregate: 1
147
+ pipeline: *mergePipeline
148
+ $readPreference: { $$exists: false }
149
+ readConcern: *readConcern
150
+ writeConcern: *writeConcern
151
+ outcome: *outcome