lanzamientos modernos de pymongo (mayor que 3.x) envuelven las operaciones a granel en una interfaz consistente que rebaja en donde la versión del servidor no admite operaciones masivas. Esto ahora es consistente en los controladores oficialmente compatibles con MongoDB.
Por lo tanto, el método preferido para la codificación es usar bulk_write()
en su lugar, donde utiliza una UpdateOne
otra acción de operación apropiada en su lugar.Y ahora, por supuesto, se prefiere usar las listas de lenguaje natural en lugar de un constructor específico
La traducción directa de la antigua documention:
from pymongo import UpdateOne
operations = [
UpdateOne({ "field1": 1},{ "$push": { "vals": 1 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 2 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 3 } },upsert=True)
]
result = collection.bulk_write(operations)
o el clásico circuito de transformación de documentos:
import random
from pymongo import UpdateOne
random.seed()
operations = []
for doc in collection.find():
# Set a random number on every document update
operations.append(
UpdateOne({ "_id": doc["_id"] },{ "$set": { "random": random.randint(0,10) } })
)
# Send once every 1000 in batch
if (len(operations) == 1000):
collection.bulk_write(operations,ordered=False)
operations = []
if (len(operations) > 0):
collection.bulk_write(operations,ordered=False)
El resultado devuelto es de BulkWriteResult
que contendrá los contadores de documentos adaptados y actualizados, así como los valores devueltos _id
para cualquier "upserts" que se producen.
hay un poco de un error sobre el tamaño de la matriz de las operaciones a granel. La solicitud real tal como se envió al servidor no puede superar el límite de BSON de 16 MB, ya que ese límite también se aplica a la "solicitud" enviada al servidor que también utiliza el formato BSON.
Sin embargo que no gobierna el tamaño de la matriz de solicitud que se puede construir, ya que sólo se enviarán las operaciones reales y se procesan en lotes de 1000 de todos modos. La única restricción real es que esas 1000 instrucciones de operación en sí mismas no crean realmente un documento BSON de más de 16 MB. Que de hecho es una orden bastante difícil.
El concepto general de los métodos a granel es "menos tráfico", como resultado de enviar cosas a la vez y sólo se trata de una respuesta del servidor. La reducción de esa sobrecarga adjunta a cada solicitud de actualización ahorra mucho tiempo.
Esto es muy triste. – ComputationalSocialScience
Esto ya no es el caso. Ver la respuesta de Kevin. –
Bulk.find.upsert() https://docs.mongodb.com/manual/reference/method/Bulk.find.upsert/index.html – Tanuj