Skip to content

Commit

Permalink
feat(NODE-3866): Add let option to ReplaceOptions for replaceOne oper…
Browse files Browse the repository at this point in the history
…ation (#3148)
  • Loading branch information
baileympearson committed Feb 18, 2022
1 parent b578d89 commit f76635a
Show file tree
Hide file tree
Showing 3 changed files with 303 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/operations/update.ts
Expand Up @@ -222,6 +222,8 @@ export interface ReplaceOptions extends CommandOperationOptions {
hint?: string | Document;
/** When true, creates a new document if no document matches the query */
upsert?: boolean;
/** Map of parameter names and values that can be accessed using $$var (requires MongoDB 5.0). */
let?: Document;
}

/** @internal */
Expand Down
207 changes: 207 additions & 0 deletions test/spec/crud/unified/replaceOne-let.json
@@ -0,0 +1,207 @@
{
"description": "replaceOne-let",
"schemaVersion": "1.0",
"createEntities": [
{
"client": {
"id": "client0",
"observeEvents": [
"commandStartedEvent"
]
}
},
{
"database": {
"id": "database0",
"client": "client0",
"databaseName": "crud-tests"
}
},
{
"collection": {
"id": "collection0",
"database": "database0",
"collectionName": "coll0"
}
}
],
"initialData": [
{
"collectionName": "coll0",
"databaseName": "crud-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
}
]
}
],
"tests": [
{
"description": "ReplaceOne with let option",
"runOnRequirements": [
{
"minServerVersion": "5.0"
}
],
"operations": [
{
"name": "replaceOne",
"object": "collection0",
"arguments": {
"filter": {
"$expr": {
"$eq": [
"$_id",
"$$id"
]
}
},
"replacement": {
"x": "foo"
},
"let": {
"id": 1
}
},
"expectResult": {
"matchedCount": 1,
"modifiedCount": 1,
"upsertedCount": 0
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"update": "coll0",
"updates": [
{
"q": {
"$expr": {
"$eq": [
"$_id",
"$$id"
]
}
},
"u": {
"x": "foo"
}
}
],
"let": {
"id": 1
}
}
}
}
]
}
],
"outcome": [
{
"collectionName": "coll0",
"databaseName": "crud-tests",
"documents": [
{
"_id": 1,
"x": "foo"
},
{
"_id": 2
}
]
}
]
},
{
"description": "ReplaceOne with let option unsupported (server-side error)",
"runOnRequirements": [
{
"minServerVersion": "3.6.0",
"maxServerVersion": "4.4.99"
}
],
"operations": [
{
"name": "replaceOne",
"object": "collection0",
"arguments": {
"filter": {
"$expr": {
"$eq": [
"$_id",
"$$id"
]
}
},
"replacement": {
"x": "foo"
},
"let": {
"id": 1
}
},
"expectError": {
"errorContains": "'update.let' is an unknown field",
"isClientError": false
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"update": "coll0",
"updates": [
{
"q": {
"$expr": {
"$eq": [
"$_id",
"$$id"
]
}
},
"u": {
"x": "foo"
}
}
],
"let": {
"id": 1
}
}
}
}
]
}
],
"outcome": [
{
"collectionName": "coll0",
"databaseName": "crud-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
}
]
}
]
}
]
}
94 changes: 94 additions & 0 deletions test/spec/crud/unified/replaceOne-let.yml
@@ -0,0 +1,94 @@
description: "replaceOne-let"

schemaVersion: "1.0"

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

initialData: &initialData
- collectionName: *collection0Name
databaseName: *database0Name
documents:
- { _id: 1 }
- { _id: 2 }

tests:
- description: "ReplaceOne with let option"
runOnRequirements:
- minServerVersion: "5.0"
operations:
- name: replaceOne
object: *collection0
arguments:
filter: &filter
$expr:
$eq: [ "$_id", "$$id" ]
replacement: &replacement
x: "foo"
let: &let
id: 1
expectResult:
matchedCount: 1
modifiedCount: 1
upsertedCount: 0
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
update: *collection0Name
updates:
-
q: *filter
u: *replacement
let: *let
outcome:
-
collectionName: *collection0Name
databaseName: *database0Name
documents:
- { _id: 1, x: "foo" }
- { _id: 2 }

- description: "ReplaceOne with let option unsupported (server-side error)"
runOnRequirements:
- minServerVersion: "3.6.0"
maxServerVersion: "4.4.99"
operations:
- name: replaceOne
object: *collection0
arguments:
filter: *filter
replacement: *replacement
let: *let
expectError:
errorContains: "'update.let' is an unknown field"
isClientError: false
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
update: *collection0Name
updates:
-
q: *filter
u: *replacement
let: *let
outcome:
-
collectionName: *collection0Name
databaseName: *database0Name
documents:
- { _id: 1 }
- { _id: 2 }

0 comments on commit f76635a

Please sign in to comment.