Skip to content

Commit c326161

Browse files
authored
PYTHON-4933 - Allow drivers to set bypassDocumentValidation: false on… (#2227)
1 parent e51ad27 commit c326161

File tree

6 files changed

+529
-30
lines changed

6 files changed

+529
-30
lines changed

pymongo/asynchronous/bulk.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __init__(
8787
self,
8888
collection: AsyncCollection[_DocumentType],
8989
ordered: bool,
90-
bypass_document_validation: bool,
90+
bypass_document_validation: Optional[bool],
9191
comment: Optional[str] = None,
9292
let: Optional[Any] = None,
9393
) -> None:
@@ -516,8 +516,8 @@ async def _execute_command(
516516
if self.comment:
517517
cmd["comment"] = self.comment
518518
_csot.apply_write_concern(cmd, write_concern)
519-
if self.bypass_doc_val:
520-
cmd["bypassDocumentValidation"] = True
519+
if self.bypass_doc_val is not None:
520+
cmd["bypassDocumentValidation"] = self.bypass_doc_val
521521
if self.let is not None and run.op_type in (_DELETE, _UPDATE):
522522
cmd["let"] = self.let
523523
if session:

pymongo/asynchronous/collection.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ async def bulk_write(
701701
self,
702702
requests: Sequence[_WriteOp[_DocumentType]],
703703
ordered: bool = True,
704-
bypass_document_validation: bool = False,
704+
bypass_document_validation: Optional[bool] = None,
705705
session: Optional[AsyncClientSession] = None,
706706
comment: Optional[Any] = None,
707707
let: Optional[Mapping] = None,
@@ -800,7 +800,7 @@ async def _insert_one(
800800
ordered: bool,
801801
write_concern: WriteConcern,
802802
op_id: Optional[int],
803-
bypass_doc_val: bool,
803+
bypass_doc_val: Optional[bool],
804804
session: Optional[AsyncClientSession],
805805
comment: Optional[Any] = None,
806806
) -> Any:
@@ -814,8 +814,8 @@ async def _insert_one(
814814
async def _insert_command(
815815
session: Optional[AsyncClientSession], conn: AsyncConnection, retryable_write: bool
816816
) -> None:
817-
if bypass_doc_val:
818-
command["bypassDocumentValidation"] = True
817+
if bypass_doc_val is not None:
818+
command["bypassDocumentValidation"] = bypass_doc_val
819819

820820
result = await conn.command(
821821
self._database.name,
@@ -840,7 +840,7 @@ async def _insert_command(
840840
async def insert_one(
841841
self,
842842
document: Union[_DocumentType, RawBSONDocument],
843-
bypass_document_validation: bool = False,
843+
bypass_document_validation: Optional[bool] = None,
844844
session: Optional[AsyncClientSession] = None,
845845
comment: Optional[Any] = None,
846846
) -> InsertOneResult:
@@ -906,7 +906,7 @@ async def insert_many(
906906
self,
907907
documents: Iterable[Union[_DocumentType, RawBSONDocument]],
908908
ordered: bool = True,
909-
bypass_document_validation: bool = False,
909+
bypass_document_validation: Optional[bool] = None,
910910
session: Optional[AsyncClientSession] = None,
911911
comment: Optional[Any] = None,
912912
) -> InsertManyResult:
@@ -986,7 +986,7 @@ async def _update(
986986
write_concern: Optional[WriteConcern] = None,
987987
op_id: Optional[int] = None,
988988
ordered: bool = True,
989-
bypass_doc_val: Optional[bool] = False,
989+
bypass_doc_val: Optional[bool] = None,
990990
collation: Optional[_CollationIn] = None,
991991
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
992992
hint: Optional[_IndexKeyHint] = None,
@@ -1041,8 +1041,8 @@ async def _update(
10411041
if comment is not None:
10421042
command["comment"] = comment
10431043
# Update command.
1044-
if bypass_doc_val:
1045-
command["bypassDocumentValidation"] = True
1044+
if bypass_doc_val is not None:
1045+
command["bypassDocumentValidation"] = bypass_doc_val
10461046

10471047
# The command result has to be published for APM unmodified
10481048
# so we make a shallow copy here before adding updatedExisting.
@@ -1082,7 +1082,7 @@ async def _update_retryable(
10821082
write_concern: Optional[WriteConcern] = None,
10831083
op_id: Optional[int] = None,
10841084
ordered: bool = True,
1085-
bypass_doc_val: Optional[bool] = False,
1085+
bypass_doc_val: Optional[bool] = None,
10861086
collation: Optional[_CollationIn] = None,
10871087
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
10881088
hint: Optional[_IndexKeyHint] = None,
@@ -1128,7 +1128,7 @@ async def replace_one(
11281128
filter: Mapping[str, Any],
11291129
replacement: Mapping[str, Any],
11301130
upsert: bool = False,
1131-
bypass_document_validation: bool = False,
1131+
bypass_document_validation: Optional[bool] = None,
11321132
collation: Optional[_CollationIn] = None,
11331133
hint: Optional[_IndexKeyHint] = None,
11341134
session: Optional[AsyncClientSession] = None,
@@ -1237,7 +1237,7 @@ async def update_one(
12371237
filter: Mapping[str, Any],
12381238
update: Union[Mapping[str, Any], _Pipeline],
12391239
upsert: bool = False,
1240-
bypass_document_validation: bool = False,
1240+
bypass_document_validation: Optional[bool] = None,
12411241
collation: Optional[_CollationIn] = None,
12421242
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
12431243
hint: Optional[_IndexKeyHint] = None,
@@ -2948,6 +2948,7 @@ async def aggregate(
29482948
returning aggregate results using a cursor.
29492949
- `collation` (optional): An instance of
29502950
:class:`~pymongo.collation.Collation`.
2951+
- `bypassDocumentValidation` (bool): If ``True``, allows the write to opt-out of document level validation.
29512952
29522953
29532954
:return: A :class:`~pymongo.asynchronous.command_cursor.AsyncCommandCursor` over the result

pymongo/synchronous/bulk.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __init__(
8787
self,
8888
collection: Collection[_DocumentType],
8989
ordered: bool,
90-
bypass_document_validation: bool,
90+
bypass_document_validation: Optional[bool],
9191
comment: Optional[str] = None,
9292
let: Optional[Any] = None,
9393
) -> None:
@@ -516,8 +516,8 @@ def _execute_command(
516516
if self.comment:
517517
cmd["comment"] = self.comment
518518
_csot.apply_write_concern(cmd, write_concern)
519-
if self.bypass_doc_val:
520-
cmd["bypassDocumentValidation"] = True
519+
if self.bypass_doc_val is not None:
520+
cmd["bypassDocumentValidation"] = self.bypass_doc_val
521521
if self.let is not None and run.op_type in (_DELETE, _UPDATE):
522522
cmd["let"] = self.let
523523
if session:

pymongo/synchronous/collection.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ def bulk_write(
700700
self,
701701
requests: Sequence[_WriteOp[_DocumentType]],
702702
ordered: bool = True,
703-
bypass_document_validation: bool = False,
703+
bypass_document_validation: Optional[bool] = None,
704704
session: Optional[ClientSession] = None,
705705
comment: Optional[Any] = None,
706706
let: Optional[Mapping] = None,
@@ -799,7 +799,7 @@ def _insert_one(
799799
ordered: bool,
800800
write_concern: WriteConcern,
801801
op_id: Optional[int],
802-
bypass_doc_val: bool,
802+
bypass_doc_val: Optional[bool],
803803
session: Optional[ClientSession],
804804
comment: Optional[Any] = None,
805805
) -> Any:
@@ -813,8 +813,8 @@ def _insert_one(
813813
def _insert_command(
814814
session: Optional[ClientSession], conn: Connection, retryable_write: bool
815815
) -> None:
816-
if bypass_doc_val:
817-
command["bypassDocumentValidation"] = True
816+
if bypass_doc_val is not None:
817+
command["bypassDocumentValidation"] = bypass_doc_val
818818

819819
result = conn.command(
820820
self._database.name,
@@ -839,7 +839,7 @@ def _insert_command(
839839
def insert_one(
840840
self,
841841
document: Union[_DocumentType, RawBSONDocument],
842-
bypass_document_validation: bool = False,
842+
bypass_document_validation: Optional[bool] = None,
843843
session: Optional[ClientSession] = None,
844844
comment: Optional[Any] = None,
845845
) -> InsertOneResult:
@@ -905,7 +905,7 @@ def insert_many(
905905
self,
906906
documents: Iterable[Union[_DocumentType, RawBSONDocument]],
907907
ordered: bool = True,
908-
bypass_document_validation: bool = False,
908+
bypass_document_validation: Optional[bool] = None,
909909
session: Optional[ClientSession] = None,
910910
comment: Optional[Any] = None,
911911
) -> InsertManyResult:
@@ -985,7 +985,7 @@ def _update(
985985
write_concern: Optional[WriteConcern] = None,
986986
op_id: Optional[int] = None,
987987
ordered: bool = True,
988-
bypass_doc_val: Optional[bool] = False,
988+
bypass_doc_val: Optional[bool] = None,
989989
collation: Optional[_CollationIn] = None,
990990
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
991991
hint: Optional[_IndexKeyHint] = None,
@@ -1040,8 +1040,8 @@ def _update(
10401040
if comment is not None:
10411041
command["comment"] = comment
10421042
# Update command.
1043-
if bypass_doc_val:
1044-
command["bypassDocumentValidation"] = True
1043+
if bypass_doc_val is not None:
1044+
command["bypassDocumentValidation"] = bypass_doc_val
10451045

10461046
# The command result has to be published for APM unmodified
10471047
# so we make a shallow copy here before adding updatedExisting.
@@ -1081,7 +1081,7 @@ def _update_retryable(
10811081
write_concern: Optional[WriteConcern] = None,
10821082
op_id: Optional[int] = None,
10831083
ordered: bool = True,
1084-
bypass_doc_val: Optional[bool] = False,
1084+
bypass_doc_val: Optional[bool] = None,
10851085
collation: Optional[_CollationIn] = None,
10861086
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
10871087
hint: Optional[_IndexKeyHint] = None,
@@ -1127,7 +1127,7 @@ def replace_one(
11271127
filter: Mapping[str, Any],
11281128
replacement: Mapping[str, Any],
11291129
upsert: bool = False,
1130-
bypass_document_validation: bool = False,
1130+
bypass_document_validation: Optional[bool] = None,
11311131
collation: Optional[_CollationIn] = None,
11321132
hint: Optional[_IndexKeyHint] = None,
11331133
session: Optional[ClientSession] = None,
@@ -1236,7 +1236,7 @@ def update_one(
12361236
filter: Mapping[str, Any],
12371237
update: Union[Mapping[str, Any], _Pipeline],
12381238
upsert: bool = False,
1239-
bypass_document_validation: bool = False,
1239+
bypass_document_validation: Optional[bool] = None,
12401240
collation: Optional[_CollationIn] = None,
12411241
array_filters: Optional[Sequence[Mapping[str, Any]]] = None,
12421242
hint: Optional[_IndexKeyHint] = None,
@@ -2941,6 +2941,7 @@ def aggregate(
29412941
returning aggregate results using a cursor.
29422942
- `collation` (optional): An instance of
29432943
:class:`~pymongo.collation.Collation`.
2944+
- `bypassDocumentValidation` (bool): If ``True``, allows the write to opt-out of document level validation.
29442945
29452946
29462947
:return: A :class:`~pymongo.command_cursor.CommandCursor` over the result

0 commit comments

Comments
 (0)