From 1a89b5b0bf8f64069b783818254893751991634b Mon Sep 17 00:00:00 2001 From: Jeferson Daniel Date: Wed, 13 Sep 2023 00:35:36 -0300 Subject: [PATCH] fix!: Uses upsert in save method BREAKING CHANGE: Saving entities will upsert if the id is present --- pydantic_mongo/abstract_repository.py | 2 +- test/test_repository.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pydantic_mongo/abstract_repository.py b/pydantic_mongo/abstract_repository.py index b607a12..76e4b06 100644 --- a/pydantic_mongo/abstract_repository.py +++ b/pydantic_mongo/abstract_repository.py @@ -112,7 +112,7 @@ def save(self, model: T) -> Union[InsertOneResult, UpdateResult]: if model.id: mongo_id = document.pop("_id") return self.get_collection().update_one( - {"_id": mongo_id}, {"$set": document} + {"_id": mongo_id}, {"$set": document}, upsert=True ) result = self.get_collection().insert_one(document) diff --git a/test/test_repository.py b/test/test_repository.py index e0de312..2f2ca37 100644 --- a/test/test_repository.py +++ b/test/test_repository.py @@ -58,6 +58,21 @@ def test_save(self, database): "bars": [{"apple": "x", "banana": "y"}], } == database["spams"].find()[0] + def test_save_upsert(self, database): + spam_repository = SpamRepository(database=database) + spam = Spam( + id=ObjectId("65012da68ea5a4798502f710"), + foo=Foo(count=1, size=1.0), + bars=[] + ) + spam_repository.save(spam) + + assert { + "_id": ObjectId(spam.id), + "foo": {"count": 1, "size": 1.0}, + "bars": [], + } == database["spams"].find()[0] + def test_delete(self, database): spam_repository = SpamRepository(database=database) foo = Foo(count=1, size=1.0)