Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
PyMongo 드라이버
/

연결 대상 선택

이 가이드에서는 연결 string 과 MongoClient 객체를 사용하여 다양한 유형의 MongoDB deployment에 연결하는 방법을 배울 수 있습니다.

MongoDB 에서 deployment에 Atlas 연결하려면 연결 에 다음 요소를 string 포함하세요.

  • Atlas cluster의 URL

  • MongoDB 사용자 이름

  • MongoDB 비밀번호

그런 다음 연결 string 을 MongoClient 생성자에 전달합니다.

Atlas 드라이버 연결 가이드 에 따라 연결 string 을 검색합니다.

Atlas 에 연결할 때 Stable API 클라이언트 옵션을 사용하여 Atlas 를 새 버전의 MongoDB Server 로 업그레이드할 때 호환성이 손상되는 변경을 방지하는 것이 좋습니다. Stable API 기능 에 학습 보려면 Stable API 페이지를 참조하세요.

다음 코드는 PyMongo 사용하여 Atlas cluster 에 연결하는 방법을 보여줍니다. 또한 이 코드는 server_api 옵션을 사용하여 Stable API 버전을 지정합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

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())

로컬 MongoDB deployment에 연결하려면 localhost 을 호스트 이름으로 사용합니다. 기본적으로 mongod 프로세스는 포트 27017 에서 실행되지만, 배포서버에 맞게 사용자 지정할 수 있습니다.

다음 코드는 PyMongo 사용하여 로컬 MongoDB deployment 에 연결하는 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

from pymongo import MongoClient
uri = "mongodb://localhost:27017/"
client = MongoClient(uri)
from pymongo import AsyncMongoClient
uri = "mongodb://localhost:27017/"
client = AsyncMongoClient(uri)

복제본 세트에 연결하려면 연결 에 IP 복제본 세트 멤버의 호스트 이름(또는 주소)과 포트 번호를 string 지정합니다.

다음 코드는 PyMongo 사용하여 3개의 호스트가 포함된 복제본 세트 에 연결하는 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

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")

복제본 세트에 있는 호스트의 전체 목록을 제공할 수 없는 경우, 복제본 세트에 있는 호스트 중 하나 이상을 지정하고 PyMongo가 자동 검색을 수행하여 다른 호스트를 찾도록 지시할 수 있습니다. 드라이버에 자동 검색을 수행하도록 지시하려면 다음 작업 중 하나를 수행합니다.

  • 복제본 세트의 이름을 replicaSet 매개변수의 값으로 지정합니다.

  • directConnection 매개 변수의 값으로 false를 지정합니다.

  • 복제본 세트에 둘 이상의 호스트를 지정합니다.

다음 예시 에서 운전자 샘플 연결 URI를 사용하여 host1를 포함한 세 개의 서로 다른 호스트의 포트 27017 에서 실행 MongoDB 복제본 세트 sampleRS에 연결합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

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)

참고

Docker에서의 복제본 세트

복제본 세트 Docker 에서 실행되면 MongoDB 엔드포인트를 하나만 노출할 수 있습니다. 이 경우 복제본 세트 검색할 수 없습니다. 연결 URI에 directConnection=false 을(를) 지정하거나 이 옵션을 설정하지 않은 상태로 두면 애플리케이션 연결 URI에 연결되지 않을 수 있습니다.

테스트 또는 개발 환경에서 directConnection=true를 지정하여 복제본 세트에 연결할 수 있습니다. 프로덕션 환경에서는 Docker 가상 네트워크 외부에서 각 MongoDB 인스턴스에 액세스할 수 있도록 클러스터를 구성하는 것이 좋습니다.

PyMongo 클라이언트의 localThresholdMS 값 내에서 연결할 수 있는 배포 전체에 걸쳐 작업의 부하를 균등하게 분산합니다. PyMongo 여러 MongoDB 배포서버에서 작업의 부하를 분산하는 방법에 대해 자세히 학습 서버 선택 사용자 지정 가이드 참조하세요.

참고

MongoClient 생성자는 비블로킹 입니다. 복제본 세트에 연결하면 클라이언트가 백그라운드 스레드를 사용하여 복제본 세트에 연결하는 동안 생성자가 즉시 반환됩니다.

MongoClient 를 구성하고 해당 nodes 속성의 string 표현을 즉시 출력하는 경우, 클라이언트가 복제본 세트 멤버에 연결하는 동안 목록이 비어 있을 수 있습니다.

복제본 세트를 초기화하려면 단일 멤버에 직접 연결해야 합니다. 이렇게 하려면 directConnection 연결 옵션을 True 로 설정합니다. MongoClient 생성자에 인수를 전달하거나 연결 string 의 매개변수를 사용하는 두 가지 방법으로 이 작업을 수행할 수 있습니다.

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)

DNS 서비스 검색을 사용하여 연결하려는 서비스의 DNS SRV 기록 조회하려면 연결 문자열 에 SRV 연결 형식을 지정합니다. 또한 SRV 연결 형식을 활성화 PyMongo 클라이언트 구성을 변경하지 않고도 새 호스트를 자동으로 다시 스캔합니다.

다음 코드는 SRV 연결 형식을 사용하는 연결 문자열 보여줍니다.

uri = "mongodb+srv://<hostname>/"

SRV 연결 형식에 대해 자세히 학습 MongoDB Server 매뉴얼의 SRV 연결 형식 항목을 참조하세요.

MongoDB Server v3.6 이하 버전에 연결하려고 하면 PyMongo에서 다음 오류가 발생할 수 있습니다.

pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 6, but this version of PyMongo requires at least 7 (MongoDB 4.0).

이는 운전자 버전이 연결하려는 서버 에 비해 너무 최신 버전일 때 발생합니다. 이 문제를 해결하려면 다음 중 하나를 수행하면 됩니다.

  • MongoDB deployment v4.0 이상으로 업그레이드합니다.

  • MongoDB Server v3.6 이상을 지원하는 PyMongo 4.10 이하 버전으로 다운그레이드합니다.

  • MongoDB Server v2.6 이상을 지원하는 PyMongo v3.x로 다운그레이드합니다.

AutoReconnect 예외는 페일오버 가 발생했음을 나타냅니다. 이는 PyMongo가 복제본 세트의 원래 프라이머리 멤버에 대한 연결을 잃었고 마지막 작업이 실패했을 수 있음을 의미합니다.

이 오류가 발생하면 PyMongo는 후속 작업을 위해 자동으로 새 프라이머리 멤버를 찾으려고 시도합니다. 오류를 처리하려면 애플리케이션에서 다음 조치 중 하나를 수행해야 합니다.

  • 실패했을 수 있는 작업 재시도

  • 작업이 실패했을 수 있다는 점을 이해하고 계속 실행합니다.

중요

PyMongo는 복제본 세트가 새 프라이머리 멤버를 선택할 때까지 모든 작업에서 AutoReconnect 오류를 발생시킵니다.

SSH 터널을 통해 MongoDB 복제본 세트에 연결하려고 하면 다음 오류가 발생합니다.

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

이는 PyMongo가 다른 복제본 세트 멤버의 주소와 포트가 포함된 isMaster 명령의 응답을 사용하여 복제본 세트 멤버를 검색하기 때문에 발생합니다. 그러나 SSH 터널을 통해 이러한 주소와 포트에 액세스할 수는 없습니다.

대신 SSH 터널링과 함께 directConnection=True 옵션을 사용하여 단일 MongoDB 노드에 직접 연결할 수 있습니다.

PyMongo에서 MongoClient 객체를 만드는 방법에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

MongoClient 만들기

이 페이지의 내용