PyMongo 데이터 삽입
PyMongo 데이터 삽입
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 서버에 연결 (로컬호스트를 사용한 예)
= MongoClient('mongodb://localhost:27017/') client
위 코드에서 MongoClient
를 사용하여 MongoDB 서버와 연결합니다. localhost
는 로컬에서 실행 중인 MongoDB 서버를 의미하며, 기본 포트인 27017
을 사용합니다. 만약 원격 서버에 연결하려면 해당 서버의 IP 주소와 포트를 사용하면 됩니다.
MongoDB Atlas에 연결
MongoDB Atlas는 클라우드 기반의 MongoDB 서비스로, 다음과 같이 연결 문자열을 설정하여 사용할 수 있습니다:
from pymongo import MongoClient
# MongoDB Atlas 연결
= MongoClient("mongodb+srv://<username>:<password>@cluster0.mongodb.net/mydatabase?retryWrites=true&w=majority") client
주의: <username>
, <password>
, <dbname>
은 사용자의 MongoDB Atlas 계정에 맞게 수정해야 합니다.
from pymongo import MongoClient
# 데이터베이스 선택
= client['testdb']
db
# 컬렉션 선택
= db['users']
collection
# 새로 생성된 문서만 출력되도록 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"},
{
]
# 여러 문서 삽입
= collection.insert_many(users) result
위 코드를 통해 MongoDB 서버에 연결하고, testdb 데이터베이스와 users 컬렉션을 선택했습니다. 컬렉션이 존재하지 않는다면 MongoDB는 데이터를 삽입할 때 자동으로 컬렉션을 생성합니다.
2. 단일 문서 삽입: insert_one()
MongoDB에 단일 문서를 삽입할 때는 insert_one()
메서드를 사용합니다. 이는 하나의 JSON 문서를 MongoDB 컬렉션에 삽입하는 매우 간단한 방법입니다.
# 단일 문서 삽입
= {
user "name": "Alice",
"age": 30,
"email": "alice@example.com"
}
= collection.insert_one(user)
result 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"}
{
]
= collection.insert_many(users)
result 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 필드에 고유 인덱스 설정
"email", unique=True) collection.create_index(
출력 결과
'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'}}