PyMongo 데이터 삽입

PyMongo 데이터 삽입

Pymongo
PyMongo 데이터 삽입
Author

gabriel yang

Published

September 28, 2024


Python과 MongoDB를 연결할 때, 우리는 PyMongo라는 강력한 라이브러리를 사용합니다. MongoDB는 비정형 데이터를 저장하는 데 매우 적합한 NoSQL 데이터베이스로, PyMongo는 이를 간편하게 다룰 수 있는 인터페이스를 제공합니다. 이번 글에서는 PyMongo의 insert_one()insert_many() 메서드를 사용하여 MongoDB에 데이터를 삽입하는 방법을 자세히 살펴보겠습니다.

1. PyMongo 설치 및 기본 설정

먼저 PyMongo를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요:

pip install pymongo

설치가 완료되면, MongoDB 서버와 연결하기 위한 코드를 작성할 수 있습니다.

MongoDB localhost에 연결

from pymongo import MongoClient

# MongoDB 서버에 연결 (로컬호스트를 사용한 예)
client = MongoClient('mongodb://localhost:27017/')

위 코드에서 MongoClient를 사용하여 MongoDB 서버와 연결합니다. localhost는 로컬에서 실행 중인 MongoDB 서버를 의미하며, 기본 포트인 27017을 사용합니다. 만약 원격 서버에 연결하려면 해당 서버의 IP 주소와 포트를 사용하면 됩니다.

MongoDB Atlas에 연결

MongoDB Atlas는 클라우드 기반의 MongoDB 서비스로, 다음과 같이 연결 문자열을 설정하여 사용할 수 있습니다:

from pymongo import MongoClient

# MongoDB Atlas 연결
client = MongoClient("mongodb+srv://<username>:<password>@cluster0.mongodb.net/mydatabase?retryWrites=true&w=majority")
Note

주의: <username>, <password>, <dbname>은 사용자의 MongoDB Atlas 계정에 맞게 수정해야 합니다.

from pymongo import MongoClient

# 데이터베이스 선택
db = client['testdb']

# 컬렉션 선택
collection = db['users']

# 새로 생성된 문서만 출력되도록 collection에 저장된 문서를 모두 삭제
collection.delete_many({})

# 테스트용 문서 목록
users = [
    {"name": "Alice", "age": 30, "email": "alice@example.com"},
    {"name": "Bob", "age": 25, "email": "bob@example.com"},
    {"name": "Charlie", "age": 35, "email": "charlie@example.com"},
    {"name": "Daisy", "age": 28, "email": "daisy@example.com"},
    {"name": "Eve", "age": 40, "email": "eve@example.com"},
    {"name": "Frank", "age": 22},  # email 필드 없음
    {"name": "Grace", "age": 50, "email": "grace@example.com"},
    {"name": "Hank", "age": 20, "email": "hank@example.com"},
]

# 여러 문서 삽입
result = collection.insert_many(users)

위 코드를 통해 MongoDB 서버에 연결하고, testdb 데이터베이스와 users 컬렉션을 선택했습니다. 컬렉션이 존재하지 않는다면 MongoDB는 데이터를 삽입할 때 자동으로 컬렉션을 생성합니다.

2. 단일 문서 삽입: insert_one()

MongoDB에 단일 문서를 삽입할 때는 insert_one() 메서드를 사용합니다. 이는 하나의 JSON 문서를 MongoDB 컬렉션에 삽입하는 매우 간단한 방법입니다.

# 단일 문서 삽입
user = {
    "name": "Alice",
    "age": 30,
    "email": "alice@example.com"
}

result = collection.insert_one(user)
print("Inserted document ID:", result.inserted_id)

출력 결과

Inserted document ID: 66f80b95202083e60117162d

코드 설명:

  • insert_one(): 단일 문서를 컬렉션에 삽입합니다. 인자로 전달된 딕셔너리 객체는 MongoDB의 문서로 저장됩니다.
  • result.inserted_id: 삽입된 문서의 고유한 ID(ObjectId)를 반환합니다. MongoDB는 각 문서에 대해 고유한 _id 필드를 자동으로 생성합니다.

이렇게 하면 users 컬렉션에 Alice라는 사용자의 문서가 삽입되고, 성공적으로 삽입된 문서의 고유 ID가 출력됩니다.

3. 여러 문서 삽입: insert_many()

한 번에 여러 문서를 삽입하려면 insert_many() 메서드를 사용합니다. 이 메서드는 리스트 형태로 여러 JSON 문서를 한꺼번에 삽입하는 데 유용합니다.

# 여러 문서 삽입
users = [
    {"name": "Bob", "age": 25, "email": "bob@example.com"},
    {"name": "Charlie", "age": 35, "email": "charlie@example.com"},
    {"name": "Daisy", "age": 28, "email": "daisy@example.com"}
]

result = collection.insert_many(users)
print("Inserted document IDs:", result.inserted_ids)

출력 결과

Inserted document IDs: [ObjectId('66f80b95202083e60117162e'), ObjectId('66f80b95202083e60117162f'), ObjectId('66f80b95202083e601171630')]

코드 설명:

  • insert_many(): 리스트 형태로 여러 문서를 MongoDB에 삽입합니다.
  • result.inserted_ids: 삽입된 모든 문서의 고유 ID(ObjectId)를 리스트로 반환합니다.

이 코드를 실행하면 users 컬렉션에 여러 사용자의 정보가 한꺼번에 삽입되고, 각 문서의 고유 ID 목록이 출력됩니다.

4. 데이터 삽입 후 확인하기

데이터가 제대로 삽입되었는지 확인하기 위해 MongoDB에서 데이터를 조회해 볼 수 있습니다. PyMongo에서는 find() 메서드를 사용하여 데이터를 조회할 수 있습니다.

# 모든 문서 조회
for user in collection.find():
    print(user)

출력 결과

{'_id': ObjectId('66f80bce202083e601171632'), 'name': 'Alice', 'age': 30, 'email': 'alice@example.com'}
{'_id': ObjectId('66f80bce202083e601171633'), 'name': 'Bob', 'age': 25, 'email': 'bob@example.com'}
{'_id': ObjectId('66f80bce202083e601171634'), 'name': 'Charlie', 'age': 35, 'email': 'charlie@example.com'}
{'_id': ObjectId('66f80bce202083e601171635'), 'name': 'Daisy', 'age': 28, 'email': 'daisy@example.com'}

이 코드는 컬렉션에 저장된 모든 문서를 출력합니다. 삽입된 문서들이 잘 저장되었는지 확인할 수 있습니다.

5. 삽입 중복 방지

MongoDB는 기본적으로 중복된 데이터를 삽입하는 것을 허용합니다. 특정 필드가 고유해야 한다면 인덱스를 설정할 수 있습니다. 예를 들어, email 필드가 고유해야 한다면 인덱스를 설정하여 중복을 방지할 수 있습니다.

# email 필드에 고유 인덱스 설정
collection.create_index("email", unique=True)

출력 결과

'email_1'

이제 email 필드가 중복된 문서를 삽입하려고 하면 오류가 발생하게 됩니다.

from pymongo import errors

# 중복된 이메일을 가진 문서 삽입
user_1 = {
    "name": "Another Alice",
    "age": 50,
    "email": "alice@example.com"
}
try:
    collection.insert_one(user_1)
    print(f"Inserted document: {user_1}")
except errors.DuplicateKeyError as e:
    print(f"Failed to insert user_1 due to duplicate email: {e}")

출력 결과

Failed to insert user_1 due to duplicate email: E11000 duplicate key error collection: testdb.users index: email_1 dup key: { email: "alice@example.com" }, full error: {'index': 0, 'code': 11000, 'errmsg': 'E11000 duplicate key error collection: testdb.users index: email_1 dup key: { email: "alice@example.com" }', 'keyPattern': {'email': 1}, 'keyValue': {'email': 'alice@example.com'}}