Overview
En esta guía, puede aprender a utilizar una cadena de conexión y MongoClient objeto para conectarse a diferentes tipos de implementaciones de MongoDB.
Atlas
Para conectarse a una implementación de MongoDB en Atlas, incluya los siguientes elementos en su cadena de conexión:
URL de su clúster Atlas
Nombre de usuario de MongoDB
Contraseña de MongoDB
Luego, pase la cadena de conexión al constructor MongoClient.
Tip
Sigue el Guía de conexión del controlador Atlas para recuperar su cadena de conexión.
Al conectarse a Atlas, recomendamos usar la opción de cliente API estable para evitar cambios importantes cuando Atlas se actualice a una nueva versión de MongoDB Server. Para obtener más información sobre la función API estable, consulte Página API estable.
El siguiente código muestra cómo usar PyMongo para conectarse a un clúster Atlas. El código también usa la opción server_api para especificar una versión estable de la API. Seleccione
Synchronous o pestaña Asynchronous para ver el código correspondiente:
from pymongo import MongoClient from pymongo.server_api import ServerApi # Replace the placeholder with your Atlas connection string uri = "<connection string>" # Create a MongoClient with a MongoClientOptions object to set the Stable API version client = MongoClient(uri, server_api=ServerApi( version='1', strict=True, deprecation_errors=True)) try: # Connect the client to the server (optional starting in v4.7) client.connect() # Send a ping to confirm a successful connection client.admin.command({'ping': 1}) print("Pinged your deployment. You successfully connected to MongoDB!") finally: # Ensures that the client will close when you finish/error client.close()
import asyncio from pymongo import AsyncMongoClient from pymongo.server_api import ServerApi async def main(): # Replace the placeholder with your Atlas connection string uri = "<connection string>" # Create a MongoClient with a MongoClientOptions object to set the Stable API version client = AsyncMongoClient(uri, server_api=ServerApi( version='1', strict=True, deprecation_errors=True)) try: # Send a ping to confirm a successful connection await client.admin.command({'ping': 1}) print("Pinged your deployment. You successfully connected to MongoDB!") finally: # Ensures that the client will close when you finish/error await client.close() asyncio.run(main())
Implementaciones locales
Para conectarse a una implementación local de MongoDB, use localhost como nombre de host. De forma predeterminada, el proceso mongod se ejecuta en el puerto 27017, aunque puede personalizarlo para su implementación.
El siguiente código muestra como usar PyMongo para conectarse a una implementación local de MongoDB. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from pymongo import MongoClient uri = "mongodb://localhost:27017/" client = MongoClient(uri)
from pymongo import AsyncMongoClient uri = "mongodb://localhost:27017/" client = AsyncMongoClient(uri)
Sets de réplicas
Para conectarse a un conjunto de réplicas, especifique los nombres de host (o direcciones IP) y los números de puerto de los miembros del conjunto de réplicas en su cadena de conexión.
El siguiente código muestra cómo usar PyMongo para conectarse a un conjunto de réplicas que contiene tres hosts. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from pymongo import MongoClient client = MongoClient("mongodb://host1:27017,host2:27017,host3:27017")
from pymongo import AsyncMongoClient client = AsyncMongoClient("mongodb://host1:27017,host2:27017,host3:27017")
Si no puede proporcionar una lista completa de hosts en el conjunto de réplicas, puede especificar uno o más de ellos e indicarle a PyMongo que realice la detección automática para encontrar los demás. Para indicarle al controlador que realice la detección automática, realice una de las siguientes acciones:
Especifique el nombre del conjunto de réplicas como el valor del parámetro
replicaSet.Especifique
falsecomo el valor del parámetrodirectConnection.Especifica más de un host en el conjunto de réplicas.
En el siguiente ejemplo, el controlador utiliza una URI de conexión de ejemplo para conectarse al conjunto de réplicas de MongoDB sampleRS, que se ejecuta en el puerto 27017 de tres hosts diferentes, incluido host1. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from pymongo import MongoClient uri = "mongodb://host1:27017/?replicaSet=sampleRS" client = MongoClient(uri)
from pymongo import AsyncMongoClient uri = "mongodb://host1:27017/?replicaSet=sampleRS" client = AsyncMongoClient(uri)
Nota
Set de réplicas en Docker
Cuando un set de réplicas se ejecuta en Docker, se podría exponer solo un punto final de MongoDB. En este caso, el set de réplicas no se puede detectar. Si se especifica directConnection=false en la URI de conexión, o se deja esta opción sin configurar, puedes evitar que tu aplicación se conecte a ella.
En un entorno de prueba o desarrollo, se puede conectar al set de réplicas especificando directConnection=true. En un entorno de producción, se recomienda configurar el clúster para que cada instancia de MongoDB sea accesible fuera de la red virtual de Docker.
PyMongo distribuye uniformemente las operaciones entre las implementaciones accesibles dentro del localThresholdMS valor del cliente. Para obtener más información sobre cómo PyMongo distribuye las operaciones entre varias implementaciones de MongoDB, consulte la guía "Personalizar la selección del servidor".
Nota
El MongoClient constructor no es bloqueante. Al conectarse a un conjunto de réplicas, el constructor retorna inmediatamente mientras el cliente usa subprocesos en segundo plano para conectarse al conjunto de réplicas.
Si construye un MongoClient e inmediatamente imprime la representación de cadena de su atributo nodes, la lista podría estar vacía mientras el cliente se conecta a los miembros del conjunto de réplicas.
Inicialización
Para inicializar un conjunto de réplicas, debe conectarse directamente a un solo miembro. Para ello, configure la opción de conexión directConnection en True. Puede hacerlo de dos maneras: pasando un argumento al constructor MongoClient o mediante un parámetro en la cadena de conexión.
from pymongo import MongoClient client = MongoClient("mongodb://<hostname>:<port>", directConnection=True)
from pymongo import MongoClient uri = ("mongodb://<hostname>:<port>/?" "directConnection=true") client = MongoClient(uri)
from pymongo import AsyncMongoClient client = AsyncMongoClient("mongodb://<hostname>:<port>", directConnection=True)
from pymongo import AsyncMongoClient uri = ("mongodb://<hostname>:<port>/?" "directConnection=true") client = AsyncMongoClient(uri)
Detección de servicios DNS
Para usar la detección de servicios DNS y buscar el registro SRV DNS del servicio al que se conecta, especifique el formato de conexión SRV en su cadena de conexión. Además, si habilita el formato de conexión SRV, PyMongo vuelve a escanear automáticamente en busca de nuevos hosts sin tener que cambiar la configuración del cliente.
El siguiente código muestra una cadena de conexión que utiliza el formato de conexión SRV:
uri = "mongodb+srv://<hostname>/"
Para aprender más sobre el formato de conexión SRV, consulta la entrada Formato de conexión SRV en el manual de MongoDB Server.
Solución de problemas
Informes del servidor Wire Versión X, PyMongo requiere Y
Si intenta conectarse a MongoDB Server v3.6 o anterior, PyMongo podría generar el siguiente error:
pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 6, but this version of PyMongo requires at least 7 (MongoDB 4.0).
Esto ocurre cuando la versión del controlador es demasiado reciente para el servidor al que se conecta. Para solucionar este problema, puede realizar una de las siguientes acciones:
Actualice su implementación de MongoDB a v4.0 o posterior.
Cambie a PyMongo 4.10 o anterior, que admite MongoDB Server v3.6 y posteriores.
Cambie a PyMongo v3.x, que admite MongoDB Server v2.6 y versiones posteriores.
Reconexión automática
Una AutoReconnect excepción indica que se ha producido una conmutación por error. Esto significa que PyMongo ha perdido la conexión con el miembro principal original del conjunto de réplicas y que su última operación podría haber fallado.
Cuando se produce este error, PyMongo intenta encontrar automáticamente el nuevo miembro principal para las operaciones posteriores. Para solucionarlo, la aplicación debe realizar una de las siguientes acciones:
Reintente la operación que pudo haber fallado
Continúe corriendo, con el entendimiento de que la operación podría haber fallado.
Importante
PyMongo genera un error AutoReconnect en todas las operaciones hasta que el conjunto de réplicas elige un nuevo miembro principal.
Tiempo de espera al acceder a MongoDB desde PyMongo con tunelización
Si intenta conectarse a un conjunto de réplicas de MongoDB a través de un túnel SSH, recibirá el siguiente error:
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1560, in count return self._count(cmd, collation, session) File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1504, in _count with self._socket_for_reads() as (connection, slave_ok): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ return self.gen.next() File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 982, in _socket_for_reads server = topology.select_server(read_preference) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 224, in select_server address)) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 183, in select_servers selector, server_timeout, address) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 199, in _select_servers_loop self._error_message(selector)) pymongo.errors.ServerSelectionTimeoutError: localhost:27017: timed out
Esto ocurre porque PyMongo detecta los miembros del conjunto de réplicas mediante la respuesta del comando isMaster, que contiene las direcciones y los puertos de los demás miembros del conjunto de réplicas. Sin embargo, no se puede acceder a estas direcciones y puertos a través del túnel SSH.
En su lugar, puede conectarse directamente a un solo nodo MongoDB utilizando la opción directConnection=True con túnel SSH.
Documentación de la API
Para aprender más sobre cómo crear un objeto MongoClient en PyMongo, consulta la siguiente documentación de API: