diff --git a/pymongo/results.py b/pymongo/results.py index b34f6c4926..00e4af8c8c 100644 --- a/pymongo/results.py +++ b/pymongo/results.py @@ -171,9 +171,10 @@ def upserted_id(self) -> Any: @property def did_upsert(self) -> bool: - """Whether or not an upsert took place.""" + """Whether an upsert took place.""" assert self.__raw_result is not None - return len(self.__raw_result.get("upserted", {})) > 0 + result = self.__raw_result.get("upserted") + return result is not None and len(str(result)) > 0 class DeleteResult(_WriteResult): diff --git a/test/test_results.py b/test/test_results.py index 19e086a9a5..e74e5107f6 100644 --- a/test/test_results.py +++ b/test/test_results.py @@ -122,6 +122,19 @@ def test_update_result(self): self.assertEqual(raw_result["n"], result.matched_count) self.assertEqual(raw_result["nModified"], result.modified_count) self.assertEqual(raw_result["upserted"], result.upserted_id) + self.assertEqual(result.did_upsert, False) + + raw_result_upserted = { + "n": 1, + "nModified": 1, + "upserted": [ + {"index": 5, "_id": 1}, + ], + } + self.repr_test(UpdateResult, raw_result_upserted) + + result = UpdateResult(raw_result_upserted, True) + self.assertEqual(result.did_upsert, True) result = UpdateResult(raw_result, False) self.assertEqual(raw_result, result.raw_result)