코딩재개발 RSS 태그 관리 글쓰기 방명록
2023-01-20 19:00:54

오늘은 python에서 pymongo 라이브러리로 MongoDB에 데이터를 CRUD하는 방법을 살펴보도록 하겠습니다. 

 

pymongo MongoDB CRUD 튜토리얼

pymongo 주요 메서드 정리

1. 한 개 문서 삽입: collection.insert_one()

2. 여러 개 문서 삽입: collection.insert_many()

3. 한 개 문서 조회: collection.find_one()

4. 여러 개 문서 조회: collection.find()

5. 한개 문서 수정: collection.update_one()

6. 여러 개 문서 수정: collection.update_many() 

7. 한개 문서 삭제: collection.delete_one()

8. 여러 개 문서 삭제: collection.delete_many()

9. collection 삭제: collection.drop()

10. 문서 수 카운트: collection.count_documents()

 

아래 코드에 어떻게 mongodb에 접속하여 collection을 생성하고, 데이터를 어떻게 삽입하고, 조회하고, 수정하고, 삭제하고, collection을 삭제하는지에 대한 예제 코드들을 정리해놓았습니다. pymongo 공식문서[1]를 참고하여 만든 예제이므로 신뢰하실만할 것입니다. 

 

import pymongo
from datetime import datetime

client = pymongo.MongoClient('mongodb://root:root@localhost:27017/test_db?authSource=admin')

db = client.test_db
collection = db.test_collection

data1 = {
    "name": "박명수",
    "age": 19,
    "birthday": datetime(1998, 3, 11),
    "nicknames": ['벼멸구', '2인자', '거성']
}

data2 = {
    "name": "정준하",
    "age": 18,
    "birthday": datetime(1999, 6, 27),
    "nicknames": ['정중앙', '쩌리짱', '정총무']
}

data34 = [
    {
        "name": "유재석",
        "age": 17,
        "birthday": datetime(2000, 5, 23),
        "nicknames": ['메뚜기', '요다', '유부장']
    },
    {
        "name": "정형돈",
        "age": 16,
        "birthday": datetime(2001, 4, 30),
        "nicknames": ['미존개오', '4대천왕', '뚱보']
    }    
]

data56 = [
    {
        "name": "하하",
        "age": 19,
        "birthday": datetime(1997, 1, 1),
        "nicknames": ['꼬마', '하사원']
    },
    {
        "name": "길",
        "age": 23,
        "birthday": datetime(1995, 9, 7),
        "nicknames": ['길인턴', '해양생물']
    }    
]


collection.insert_one(data1) # 한 개 문서 삽입
collection.insert_one(data2)
collection.insert_many(data34) # 여러 문서 삽입
collection.insert_many(data56)


print("\n\n한 개 문서 조회")
print(collection.find_one())


print("\n\n조건이 맞는 한 개 문서 조회")
print(collection.find_one({'name': '정형돈'})) 


print("\n\n모든 문서 조회")
results = collection.find()
# find()는 cursor 객체를 반환. 모든 매칭되는 문서를 이터레이트할 수 있도록 해줌. 

for result in results:
    print(result)


print("\n\n3개 문서 조회")
results = collection.find().limit(3)

for result in results:
    print(result)


print("\n\n조건이 맞는 모든 문서 조회")
results = collection.find({'age': 19})

for result in results:
    print(result)


print("\n\n2000년 1월 1일 미만 출생자 조회. 생일 기준 오름차순 정렬")
results = collection.find({'birthday': {"$lt": datetime(2000, 1, 1)}}).sort("birthday") 
# $lt: less than 
# https://www.mongodb.com/docs/manual/reference/operator/query/

for result in results:
    print(result)


print("\n\n2000년 1월 1일 이후 출생자 조회. 이름 기준 내림차순 정렬")
results = collection.find({'birthday': {"$gte": datetime(2000, 1, 1)}}).sort("name", pymongo.DESCENDING) 
# $gte: greater than or equal 
# https://pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html#pymongo.cursor.Cursor.sort

for result in results:
    print(result)


print("\n\n나이로 내림차순 정렬 후 이름으로 오름차순 정렬")
results = collection.find().sort([("age", pymongo.DESCENDING), ("name", pymongo.ASCENDING)]) 

for result in results:
    print(result)


print("\n\n17세 이상 19세 이하 조회.")
results = collection.find({"age": {"$gte": 17, "$lte": 19}}) 

for result in results:
    print(result)


print("\n\n전체 문서 수 카운트.")
print(collection.count_documents({})) 


print("\n\n19세인 사람수 카운트.")
print(collection.count_documents({"age": 19})) 


print("\n\n이름 하하인 문서의 이름 하하하로 수정")
collection.update_one({'name':'하하'}, {"$set": {'name': '하하하'}}) 


print("\n\n나이가 19인 문서들 나이 91로 수정")
collection.update_many({'age':19}, {"$set": {'age': 91}}) 


print("\n\n이름이 노홍철인 문서 이름 노홍칠로 수정. 없다면 문서 삽입.")
collection.update_one({'name':'노홍철'}, {"$set": {'name': '노홍칠'}}, upsert=True) 
# upsert = update or insert


print("\n\n이름이 길인 문서 삭제")
collection.delete_one({'name':'길'}) 


print("\n\n나이가 91세인 문서들 삭제")
collection.delete_many({'age':91}) 


print("\n\n모든 문서 삭제")
collection.delete_many({})


print("\n\ncollection 삭제")
collection.drop()

 

참고자료

[1] https://pymongo.readthedocs.io/en/stable/tutorial.html

글을 읽던 중에 궁금했던 부분은 질문해주세요.
칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.
최대한 답변 드리도록 노력하겠습니다.
욕설과 광고를 담은 댓글은 가차없이 삭제합니다.
비밀글