I created an Azure Cosmos (RU) Serverless database (sharded) with a MongoDB engine and would like to use Python and pymongo
to run queries on it. I am not managing to connect to it in any way.
I have tested both version 3.6 and version 7.0 of the Mongo DB Server.
The connection string I use has this format:
mongodb://{user_name}:{primary_key}@{service_name}.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@{service_name}@
I tried different versions of pymongo, but no luck. Tested on different networks (no firewall connectivity problems).
Also, with azure-cosmos
the connection works, but it cannot be used for nosql engines.
The code I use is as follows. It goes into a timeout:
import pymongo
CONN_STRING = “mongodb://etc....”
client = pymongo.MongoClient(CONN_STRING)
client.list_database_names()
Error:
{
"name": "ServerSelectionTimeoutError",
"message": "{service_name}.mongo.cosmos.azure.com:10255: timed out, Timeout: 30s, Topology Description: <TopologyDescription id: 6734b32d878003e1a30f46fb, topology_type: Single, servers: [<ServerDescription ('{service_name}.mongo.cosmos.azure.com', 10255) server_type: Unknown, rtt: None, error=NetworkTimeout('{service_name}.mongo.cosmos.azure.com:10255: timed out')>]>",
"stack": "---------------------------------------------------------------------------
ServerSelectionTimeoutError Traceback (most recent call last)
Cell In[17], line 1
----> 1 client.list_database_names()
File ...\Lib\site-packages\pymongo\mongo_client.py:1918, in MongoClient.list_database_names(self, session)
1908 def list_database_names(self, session=None):
1909 """Get a list of the names of all databases on the connected server.
1910
1911 :Parameters:
(...)
1915 .. versionadded:: 3.6
1916 """
1917 return [doc["name"]
-> 1918 for doc in self.list_databases(session, nameOnly=True)]
File ...\Lib\site-packages\pymongo\mongo_client.py:1899, in MongoClient.list_databases(self, session, **kwargs)
1897 cmd.update(kwargs)
1898 admin = self._database_default_options("admin")
-> 1899 res = admin._retryable_read_command(cmd, session=session)
1900 # listDatabases doesn't return a cursor (yet). Fake one.
1901 cursor = {
1902 "id": 0,
1903 "firstBatch": res["databases"],
1904 "ns": "admin.$cmd",
1905 }
File ...\Lib\site-packages\pymongo\database.py:755, in Database._retryable_read_command(self, command, value, check, allowable_errors, read_preference, codec_options, session, **kwargs)
750 def _cmd(session, server, sock_info, slave_ok):
751 return self._command(sock_info, command, slave_ok, value,
752 check, allowable_errors, read_preference,
753 codec_options, session=session, **kwargs)
--> 755 return self.__client._retryable_read(
756 _cmd, read_preference, session)
File ...\Lib\site-packages\pymongo\mongo_client.py:1460, in MongoClient._retryable_read(self, func, read_pref, session, address, retryable, exhaust)
1458 while True:
1459 try:
-> 1460 server = self._select_server(
1461 read_pref, session, address=address)
1462 if not server.description.retryable_reads_supported:
1463 retryable = False
File ...\Lib\site-packages\pymongo\mongo_client.py:1278, in MongoClient._select_server(self, server_selector, session, address)
1275 raise AutoReconnect('server %s:%d no longer available'
1276 % address)
1277 else:
-> 1278 server = topology.select_server(server_selector)
1279 # Pin this session to the selected server if it's performing a
1280 # sharded transaction.
1281 if server.description.mongos and (session and
1282 session.in_transaction):
File ...\Lib\site-packages\pymongo\topology.py:241, in Topology.select_server(self, selector, server_selection_timeout, address)
236 def select_server(self,
237 selector,
238 server_selection_timeout=None,
239 address=None):
240 """Like select_servers, but choose a random server if several match."""
--> 241 return random.choice(self.select_servers(selector,
242 server_selection_timeout,
243 address))
File ...\Lib\site-packages\pymongo\topology.py:199, in Topology.select_servers(self, selector, server_selection_timeout, address)
196 server_timeout = server_selection_timeout
198 with self._lock:
--> 199 server_descriptions = self._select_servers_loop(
200 selector, server_timeout, address)
202 return [self.get_server_by_address(sd.address)
203 for sd in server_descriptions]
File ...\Lib\site-packages\pymongo\topology.py:215, in Topology._select_servers_loop(self, selector, timeout, address)
212 while not server_descriptions:
213 # No suitable servers.
214 if timeout == 0 or now > end_time:
--> 215 raise ServerSelectionTimeoutError(
216 "%s, Timeout: %ss, Topology Description: %r" %
217 (self._error_message(selector), timeout, self.description))
219 self._ensure_opened()
220 self._request_check_all()
ServerSelectionTimeoutError: {service_name}.mongo.cosmos.azure.com:10255: timed out, Timeout: 30s, Topology Description: <TopologyDescription id: 6734b32d878003e1a30f46fb, topology_type: Single, servers: [<ServerDescription ('{service_name}.mongo.cosmos.azure.com', 10255) server_type: Unknown, rtt: None, error=NetworkTimeout('{service_name}.mongo.cosmos.azure.com:10255: timed out')>]>"
}```
2
Answers
Here is an easy way, Goto your Azure Cosmos DB Mongo RU account and navigate to quick start, you will find Python sample in the quick start, just download and repalce the variable names in the code, you will be good to go,
Here is the client code,
The above error may occur because of using
MongoClient
without importing it from pymongo. Try with the below code, it importsMongoClient
frompymongo
.Output: