1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
description: aggregate-write-readPreference
schemaVersion: '1.4'
runOnRequirements:
# 3.6+ non-standalone is needed to utilize $readPreference in OP_MSG
- minServerVersion: "3.6"
topologies: [ replicaset, sharded, load-balanced ]
_yamlAnchors:
readConcern: &readConcern
level: &readConcernLevel "local"
writeConcern: &writeConcern
w: &writeConcernW 1
createEntities:
- client:
id: &client0 client0
observeEvents:
- commandStartedEvent
# Used to test that read and write concerns are still inherited
uriOptions:
readConcernLevel: *readConcernLevel
w: *writeConcernW
- database:
id: &database0 database0
client: *client0
databaseName: &database0Name db0
- collection:
id: &collection0 collection0
database: *database0
collectionName: &collection0Name coll0
collectionOptions:
readPreference: &readPreference
# secondaryPreferred is specified for compatibility with clusters that
# may not have a secondary (e.g. each shard is only a primary).
mode: secondaryPreferred
# maxStalenessSeconds is specified to ensure that drivers forward the
# read preference to mongos or a load balancer. That would not be the
# case with only secondaryPreferred.
maxStalenessSeconds: 600
- collection:
id: &collection1 collection1
database: *database0
collectionName: &collection1Name coll1
initialData:
- collectionName: *collection0Name
databaseName: *database0Name
documents:
- { _id: 1, x: 11 }
- { _id: 2, x: 22 }
- { _id: 3, x: 33 }
- collectionName: *collection1Name
databaseName: *database0Name
documents: []
tests:
- description: "Aggregate with $out includes read preference for 5.0+ server"
runOnRequirements:
- minServerVersion: "5.0"
serverless: "forbid"
operations:
- object: *collection0
name: aggregate
arguments:
pipeline: &outPipeline
- { $match: { _id: { $gt: 1 } } }
- { $sort: { x: 1 } }
- { $out: *collection1Name }
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *outPipeline
$readPreference: *readPreference
readConcern: *readConcern
writeConcern: *writeConcern
outcome: &outcome
- collectionName: *collection1Name
databaseName: *database0Name
documents:
- { _id: 2, x: 22 }
- { _id: 3, x: 33 }
- description: "Aggregate with $out omits read preference for pre-5.0 server"
runOnRequirements:
# MongoDB 4.2 introduced support for read concerns and write stages.
# Pre-4.2 servers may allow a "local" read concern anyway, but some
# drivers may avoid inheriting a client-level read concern for pre-4.2.
- minServerVersion: "4.2"
maxServerVersion: "4.4.99"
serverless: "forbid"
operations:
- object: *collection0
name: aggregate
arguments:
pipeline: *outPipeline
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *outPipeline
$readPreference: { $$exists: false }
readConcern: *readConcern
writeConcern: *writeConcern
outcome: *outcome
- description: "Aggregate with $merge includes read preference for 5.0+ server"
runOnRequirements:
- minServerVersion: "5.0"
operations:
- object: *collection0
name: aggregate
arguments:
pipeline: &mergePipeline
- { $match: { _id: { $gt: 1 } } }
- { $sort: { x: 1 } }
- { $merge: { into: *collection1Name } }
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *mergePipeline
$readPreference: *readPreference
readConcern: *readConcern
writeConcern: *writeConcern
outcome: *outcome
- description: "Aggregate with $merge omits read preference for pre-5.0 server"
runOnRequirements:
- minServerVersion: "4.2"
maxServerVersion: "4.4.99"
operations:
- object: *collection0
name: aggregate
arguments:
pipeline: *mergePipeline
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *mergePipeline
$readPreference: { $$exists: false }
readConcern: *readConcern
writeConcern: *writeConcern
outcome: *outcome
|