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