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
|
description: "aggregate-let"
schemaVersion: "1.4"
createEntities:
- client:
id: &client0 client0
observeEvents: [ commandStartedEvent ]
- database:
id: &database0 database0
client: *client0
databaseName: &database0Name crud-tests
- collection:
id: &collection0 collection0
database: *database0
collectionName: &collection0Name coll0
- collection:
id: &collection1 collection1
database: *database0
collectionName: &collection1Name coll1
initialData: &initialData
- collectionName: *collection0Name
databaseName: *database0Name
documents:
- { _id: 1 }
- collectionName: *collection1Name
databaseName: *database0Name
documents: [ ]
tests:
- description: "Aggregate with let option"
runOnRequirements:
- minServerVersion: "5.0"
operations:
- name: aggregate
object: *collection0
arguments:
pipeline: &pipeline0
# $match takes a query expression, so $expr is necessary to utilize
# an aggregate expression context and access "let" variables.
- $match: { $expr: { $eq: ["$_id", "$$id"] } }
- $project: { _id: 0, x: "$$x", y: "$$y", rand: "$$rand" }
# Values in "let" must be constant or closed expressions that do not
# depend on document values. This test demonstrates a basic constant
# value, a value wrapped with $literal (to avoid expression parsing),
# and a closed expression (e.g. $rand).
let: &let0
id: 1
x: foo
y: { $literal: "$bar" }
rand: { $rand: {} }
expectResult:
- { x: "foo", y: "$bar", rand: { $$type: "double" } }
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *pipeline0
let: *let0
- description: "Aggregate with let option unsupported (server-side error)"
runOnRequirements:
- minServerVersion: "2.6.0"
maxServerVersion: "4.4.99"
operations:
- name: aggregate
object: *collection0
arguments:
pipeline: &pipeline1
- $match: { _id: 1 }
let: &let1
x: foo
expectError:
# Older server versions may not report an error code, but the error
# message is consistent between 2.6.x and 4.4.x server versions.
errorContains: "unrecognized field 'let'"
isClientError: false
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *pipeline1
let: *let1
- description: "Aggregate to collection with let option"
runOnRequirements:
- minServerVersion: "5.0"
serverless: "forbid"
operations:
- name: aggregate
object: *collection0
arguments:
pipeline: &pipeline2
- $match: { $expr: { $eq: ["$_id", "$$id"] } }
- $project: { _id: 1 }
- $out: *collection1Name
let: &let2
id: 1
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *pipeline2
let: *let2
outcome:
- collectionName: *collection1Name
databaseName: *database0Name
documents:
- { _id: 1 }
- description: "Aggregate to collection with let option unsupported (server-side error)"
runOnRequirements:
- minServerVersion: "2.6.0"
maxServerVersion: "4.4.99"
operations:
- name: aggregate
object: *collection0
arguments:
pipeline: *pipeline2
let: *let2
expectError:
errorContains: "unrecognized field 'let'"
isClientError: false
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
aggregate: *collection0Name
pipeline: *pipeline2
let: *let2
|