From 8adce476d165c81fc48298bf4ed55ff2e18825ef Mon Sep 17 00:00:00 2001 From: Erfan Safari Date: Fri, 22 Oct 2021 19:04:05 +0330 Subject: [PATCH] feat: implement replaceOne (#281) * feat: implement replaceOne * chore: use optional chaining instead of ternary operator --- src/collection/collection.ts | 34 +++++++++++++++++++++++++++++++++- tests/cases/03_curd.ts | 17 ++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/collection/collection.ts b/src/collection/collection.ts index 7d7bfd8c..9a5ff633 100644 --- a/src/collection/collection.ts +++ b/src/collection/collection.ts @@ -208,7 +208,7 @@ export class Collection { multi: false, }); return { - upsertedId: upsertedIds ? upsertedIds[0] : undefined, + upsertedId: upsertedIds?.[0], upsertedCount, matchedCount, modifiedCount, @@ -232,6 +232,38 @@ export class Collection { }); } + async replaceOne( + filter: Filter, + replacement: InsertDocument, + options?: UpdateOptions, + ) { + if (hasAtomicOperators(replacement)) { + throw new MongoInvalidArgumentError( + "Replacement document must not contain atomic operators", + ); + } + + const { upsertedIds = [], upsertedCount, matchedCount, modifiedCount } = + await update( + this.#protocol, + this.#dbName, + this.name, + filter, + replacement, + { + ...options, + multi: false, + }, + ); + + return { + upsertedId: upsertedIds?.[0], + upsertedCount, + matchedCount, + modifiedCount, + }; + } + async deleteMany( filter: Filter, options?: DeleteOptions, diff --git a/tests/cases/03_curd.ts b/tests/cases/03_curd.ts index 1de6dbd6..5bfae850 100644 --- a/tests/cases/03_curd.ts +++ b/tests/cases/03_curd.ts @@ -206,6 +206,21 @@ export default function curdTests() { assertEquals(result.upsertedCount, 1); }); + testWithClient("testReplaceOne", async (client) => { + const db = client.database("test"); + const users = db.collection("mongo_test_users"); + const result = await users.replaceOne({ username: "USER2" }, { + username: "USER3", + }); + + assertEquals(result, { + matchedCount: 1, + modifiedCount: 1, + upsertedCount: 0, + upsertedId: undefined, + }); + }); + testWithClient("testDeleteOne", async (client) => { const db = client.database("test"); const users = db.collection("mongo_test_users"); @@ -317,7 +332,7 @@ export default function curdTests() { const db = client.database("test"); const users = db.collection("mongo_test_users"); const user1 = await users.distinct("username"); - assertEquals(user1, ["USER2", "user1"]); + assertEquals(user1, ["USER3", "user1"]); }); testWithClient("testDropConnection", async (client) => {