Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Actualizar las versiones de PyMongo

Esta página describe los cambios que debe realizar en su aplicación al actualizar a una nueva versión de PyMongo.

Importante

Esta guía incluye cambios incompatibles únicamente con las versiones de PyMongo posteriores a la4.0 v. Si está actualizando desde PyMongo v2 o v,3 consulte la Guía de migración de PyMongo.4

Antes de actualizar, realiza las siguientes acciones:

  • Asegúrese de que la nueva versión de PyMongo sea compatible con las versiones de MongoDB Server a las que se conecta su aplicación y con la versión de Python en la que se ejecuta su aplicación. Para obtener información sobre la compatibilidad de versiones, consulta la página de Compatibilidad.

  • Resuelva cualquier cambio disruptivo entre la versión del driver que utiliza su aplicación y la versión de actualización planificada en la sección Cambios disruptivos.

Tip

Para minimizar la cantidad de cambios que tu aplicación requiere al actualizar las versiones del driver en el futuro, utiliza la Stable API.

Cuando utilices una funcionalidad obsoleta de PyMongo, el driver generará un DeprecationWarning. Por defecto, el intérprete de Python silencia estas advertencias. Para imprimirlas en stderr, inicia Python con las opciones -Wd.

El siguiente ejemplo ejecuta insert.py, una aplicación de Python que llama a un método obsoleto. El intérprete muestra un DeprecationWarning porque Python se inició con las opciones -Wd.

$ python3 -Wd insert.py
insert.py:4: DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.
client.test.test.insert({})

Para tratar los mensajes de DeprecationWarning como excepciones, inicie Python con las opciones -We en su lugar, como se muestra en el siguiente ejemplo:

$ python3 -We insert.py
Traceback (most recent call last):
File "insert.py", line 4, in <module>
client.test.test.insert({})
File "/home/durin/work/mongo-python-driver/pymongo/collection.py", line 2906, in insert
"instead.", DeprecationWarning, stacklevel=2)
DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.

Tip

Para obtener más información sobre los avisos del intérprete y la opción -W, consulta la siguiente documentación de Python:

Un cambio disruptivo es un cambio en una convención o comportamiento que empieza a partir de una versión específica del driver. Este tipo de cambios puede evitar que tu aplicación funcione correctamente si no se abordan antes de actualizar el controlador.

Los cambios disruptivos en esta sección se categorizan según la versión del driver que los ha introducido. Al actualizar las versiones del driver, debes abordar todos los cambios disruptivos entre la versión actual y la versión de actualización.

Ejemplo

Actualización desde la versión 4.0

Si estás actualizando PyMongo de la v4.0 a la v4.7, atiende todos los cambios disruptivos listados para las versiones 4.1 a 4.7, si los hay.

  • Descarta el soporte para el MongoDB Server v4.2. La versión mínima compatible de MongoDB Server es ahora la v4.4.

  • Los métodos asistentes de agregación lanzan un pymongo.errors.ConfigurationError si pasa un argumento de palabra clave aggregate o pipeline. Anteriormente, estas claves reemplazaban silenciosamente el namespace de destino y el pipeline del comando aggregate generado. Este cambio afecta a los siguientes métodos en las clases síncronas y asíncronas:

    • Collection.aggregate()

    • Collection.aggregate_raw_batches()

    • Database.aggregate()

    • Collection.list_search_indexes()

  • Los eventos de supervisión de comandos y los mensajes de registro de comandos para una única operación lógica comparten un operation_id estable en todos los intentos de reintento de esa operación. Como resultado, operation_id ya no es igual al request_id por intento para estas operaciones.

  • Documentos y subdocumentos que tienen un tamaño de 4 KB o más y se decodifican en bson.raw_bson.RawBSONDocument objetos desde un búfer inmutable se exponen como segmentos memoryview de solo lectura en lugar de bytes copias. Los documentos decodificados de búferes mutables, como un bytearray, son siempre bytes copias.

  • El método bson.get_data_and_view() devuelve una vista de una copia privada de bytes para entradas de protocolo de búfer distintas de bytes o bytearray.

  • Si utiliza un exhaust cursor (CursorType.EXHAUST) con una versión de mongos anterior a la v7.1, el driver genera un error pymongo.errors.InvalidOperation en la primera iteración del cursor en lugar de desde el método find(), porque el driver comprueba el requisito con la conexión en uso. Los cursores asíncronos que combinan limit con CursorType.EXHAUST generan el error desde el método find() en lugar de en la primera iteración, lo que coincide con la API síncrona.

  • Descarta el soporte para el MongoDB Server v4.0. La versión mínima compatible de MongoDB Server es ahora la v4.2.

  • Cuando codificas un objeto bson.binary.BinaryVector, el valor del campo de metadatos padding debe cumplir con las siguientes condiciones:

    • Si el subtipo binario es PACKED_BIT, el valor debe estar entre 0 y 7 (inclusive).

    • Si no, el valor debe ser 0.

    Si no se cumplen las condiciones anteriores, PyMongo genera un ValueError.

  • El parámetro options para el método uri_parser.parse_uri() es del tipo dict. Anteriormente, este parámetro era del tipo _CaseInsensitiveDictionary.

  • Descarta el soporte para el MongoDB Server v3.6. La versión mínima compatible de MongoDB Server es ahora la v4.0.

  • Se desaprueba el soporte para MongoDB Server v4.0. De acuerdo con los Cronogramas del ciclo de vida del software de MongoDB, una próxima versión menor de PyMongo aumentará la versión mínima de MongoDB Server de 4.0 a 4.2.

  • Descarta el soporte para el Python v3.8. A versão mínima do Python suportada agora é v3.9.

  • Se elimina el soporte para PyPy v3.9. La versión mínima de PyPy compatible es ahora la v3.10.

  • Deja de soportar el mecanismo de autenticación MONGODB-CR. Para obtener más información sobre autenticación, consulta la guía de Mecanismos de Autenticación.

  • Debido a que PyMongo v4.8 utiliza hatch como su sistema de compilación backend, ya no puedes compilar el driver usando el archivo setup.py. En su lugar, debe instalar PyMongo usando pip. Para instalaciones editables, debe utilizar pip v21.3 o una versión posterior.
  • Todas las incidencias del tipo de colección SON en todas las clases internas y comandos se han cambiado a dict.

  • La propiedad options.pool_options.metadata ahora es de tipo dict, no SON. El siguiente ejemplo de código muestra las diferencias en la forma en que estos formatos almacenan datos:

# Before (SON)
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> client.options.pool_options.metadata
SON([('driver', SON([('name', 'PyMongo'), ('version', '4.7.0.dev0')])), ('os', SON([('type', 'Darwin'), ('name', 'Darwin'), ('architecture', 'arm64'), ('version', '14.3')])), ('platform', 'CPython 3.11.6.final.0')])
# After (dict)
>>> client.options.pool_options.metadata
{'driver': {'name': 'PyMongo', 'version': '4.7.0.dev0'}, 'os': {'type': 'Darwin', 'name': 'Darwin', 'architecture': 'arm64', 'version': '14.3'}, 'platform': 'CPython 3.11.6.final.0'}

Para convertir un objeto de dict de una sola capa en un objeto de SON, pasa el objeto de dict al constructor de SON, tal como se muestra en el siguiente ejemplo:

>>> data_as_dict = client.options.pool_options.metadata
>>> SON(data_as_dict)
SON([('driver', {'name': 'PyMongo', 'version': '4.7.0.dev0'}), ('os', {'type': 'Darwin', 'name': 'Darwin', 'architecture': 'arm64', 'version': '14.3'}), ('platform', 'CPython 3.11.6.final.0')])

Si el objeto dict tiene varias capas, debes convertir los valores uno a la vez, como se muestra en el siguiente ejemplo:

>>> def dict_to_SON(data_as_dict: dict[Any, Any]):
... data_as_SON = SON()
... for key, value in data_as_dict.items():
... data_as_SON[key] = dict_to_SON(value) if isinstance(value, dict) else value
... return data_as_SON
>>>
>>> dict_to_SON(data_as_dict)
SON([('driver', SON([('name', 'PyMongo'), ('version', '4.7.0.dev0')])), ('os', SON([('type', 'Darwin'), ('name', 'Darwin'), ('architecture', 'arm64'), ('version', '14.3')])), ('platform', 'CPython 3.11.6.final.0')])
  • Para mejorar la compatibilidad con la herramienta Pyright, la ClientSession clase ya no utiliza tipado genérico.

  • Se requiere pymongocrypt v1.3.0 o posterior para el cifrado a nivel de campo del lado del cliente (CSFLE).

  • Los paquetes bson, pymongo y gridfs ahora utilizan la variable __all__ para declarar sus APIs públicas. Si tu aplicación contiene una instrucción from bson import *, asegúrese de que siga importando las APIs necesarias.

  • El método estimated_document_count() siempre utiliza el comando count. Este comando no está disponible en la API estable en las versiones 5.0.0 de MongoDB até 5.0.8. Si usas el método estimated_document_count() con la Stable API, debes actualizar a MongoDB Server v5.0.9 o posterior, o configurar la opción pymongo.server_api.ServerApi.strict en False.