Skip to content

Commit 1b3df52

Browse files
committed
Use ChainMap
1 parent 425cd1b commit 1b3df52

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

pymongo/asynchronous/client_bulk.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import copy
2222
import datetime
2323
import logging
24+
from collections import ChainMap
2425
from collections.abc import MutableMapping
2526
from itertools import islice
2627
from typing import (
@@ -133,10 +134,9 @@ def add_insert(self, namespace: str, document: _DocumentOut) -> None:
133134
validate_is_document_type("document", document)
134135
# Generate ObjectId client side.
135136
if not (isinstance(document, RawBSONDocument) or "_id" in document):
136-
new_document = {"_id": ObjectId()}
137-
new_document.update(document)
138-
document.clear()
139-
document.update(new_document)
137+
document = ChainMap(document, {"_id": ObjectId()})
138+
elif not isinstance(document, RawBSONDocument) and "_id" in document:
139+
document = ChainMap(document, {"_id": document["_id"]})
140140
cmd = {"insert": -1, "document": document}
141141
self.ops.append(("insert", cmd))
142142
self.namespaces.append(namespace)

pymongo/synchronous/client_bulk.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import copy
2222
import datetime
2323
import logging
24+
from collections import ChainMap
2425
from collections.abc import MutableMapping
2526
from itertools import islice
2627
from typing import (
@@ -133,10 +134,9 @@ def add_insert(self, namespace: str, document: _DocumentOut) -> None:
133134
validate_is_document_type("document", document)
134135
# Generate ObjectId client side.
135136
if not (isinstance(document, RawBSONDocument) or "_id" in document):
136-
new_document = {"_id": ObjectId()}
137-
new_document.update(document)
138-
document.clear()
139-
document.update(new_document)
137+
document = ChainMap(document, {"_id": ObjectId()})
138+
elif not isinstance(document, RawBSONDocument) and "_id" in document:
139+
document = ChainMap(document, {"_id": document["_id"]})
140140
cmd = {"insert": -1, "document": document}
141141
self.ops.append(("insert", cmd))
142142
self.namespaces.append(namespace)

test/mockupdb/test_id_ordering.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,21 @@ def test_id_ordering(self):
5050
request = server.receives()
5151
self.assertEqual("_id", next(iter(request["ops"][0]["document"])))
5252
request.reply({"ok": 1})
53+
54+
# Re-ordering user-supplied _id fields is not required by the spec, but PyMongo does it for performance reasons
55+
with going(collection.insert_one, {"x": 1, "_id": 111}):
56+
request = server.receives()
57+
self.assertEqual("_id", next(iter(request["documents"][0])))
58+
request.reply({"ok": 1})
59+
60+
with going(collection.bulk_write, [InsertOne({"x1": 1, "_id": 1111})]):
61+
request = server.receives()
62+
self.assertEqual("_id", next(iter(request["documents"][0])))
63+
request.reply({"ok": 1})
64+
65+
with going(
66+
client.bulk_write, [InsertOne(namespace="db.coll", document={"x2": 1, "_id": 11111})]
67+
):
68+
request = server.receives()
69+
self.assertEqual("_id", next(iter(request["ops"][0]["document"])))
70+
request.reply({"ok": 1})

0 commit comments

Comments
 (0)