개요
- Python을 사용해서 Mongodb를 다루는 법을 정리해둔다.
- OS에 MongoDB가 설치되어 기본포트인 27017번 포트로 MongoDB가 서비스중인 상태이다.
- MongoDB는 JSON 타입의 데이터를 다루는데 아주 궁합이 좋다.
MongoDB와 RDBMS의 구성요소를 비교해보면 다음과 같다. MongoDB의 컬렉션(Collection)은 RDBMS의 테이블과 같은 개념이다.
출처: https://rastalion.dev/mongodb-collection-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/
설치
python -m pip install pymongo
모듈 임포트하기
import pymongo
DB 접속 클라이언트 생성하기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"] # 데이터베이스명을 지정한다.
컬렉션 지정하기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
컬렉션에 데이터 삽입하기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mydict = { "name": "John", "address": "Highway 37" }
x = mycol.insert_one(mydict)
print(x.inserted_id) # id 필드 확인
컬렉션에서 조건을 줘서 데이터 찾기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
for x in mycol.find({},{ "_id": 0, "name": 1, "address": 1 }):
print(x)
컬렉션에서 조건을 줘서 데이터 찾기2 (쿼리 오브젝트 사용)
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": { "$gt": "S" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
찾은 결과 정렬하기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mydoc = mycol.find().sort("name")
for x in mydoc:
print(x)
컬렉션에서 데이터 삭제하기
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": "Mountain 21" }
mycol.delete_one(myquery)
컬렉션에서 데이터 업데이트하기
- address 필드의 값을 “Valley 345” 에서 “Canyon 123” 로 업데이트한다.
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": "Valley 345" }
newvalues = { "$set": { "address": "Canyon 123" } }
mycol.update_one(myquery, newvalues)
#print "customers" after the update:
for x in mycol.find():
print(x)
트러블슈팅
pymongo.errors.CursorNotFound 에러가 발생할 때
현상: PyMongo 사용중 다음과 같은 에러가 발생한다.
pymongo.errors.CursorNotFound: cursor id 7073505406508033101 not found, full error: {'ok': 0.0, 'errmsg': 'cursor id 7073505406508033101 not found', 'code': 43, 'codeName': 'CursorNotFound'}
- 스택오버플로 (https://stackoverflow.com/questions/24199729/pymongo-errors-cursornotfound-cursor-id-not-valid-at-server) 를 읽어 보면, 10분이상 비활성(inactivate) 상태여서 타임아웃이 발생한 것이라고 한다.
- 아마 처리가 10분이상 걸리는 작업이면 이 에러가 발생할 것 같기도 하다.
- 몽고db의 collection 객체의 find 메서드 실행시에
no_cursor_timeout=True
옵션을 주면 해결된다고 한다. (처리가 끝나면 반드시 커서를 종료시켜야 한다.)
‘update’ command document too large
하나의 도큐먼트의 사이즈가 너무 크면 저장할 수 없다.
mongo 셸에서 다음 커맨드를 입력하면 현재 제한 사이즈를 볼 수 있다. 16MB로 되어 있었다. 아쉽지만 몽고DB에서 Document의 제한 사이즈는 변경할 수 없다는 것 같다.
mongo
> db.isMaster().maxBsonObjectSize/(1024*1024)+' MB'
16 MB
참고: 윈도우즈에서 Mongo셸을 실행하고 싶을 때
Mongo 셸의 바이너리는 “C:\Program Files\MongoDB\Server\5.0\bin\mongo.exe”에 설치되어 있다. 이 것을 실행한다. PATH 환경변수에 등록해두면 좋다.
참고 URL
- https://www.w3schools.com/python/python_mongodb_getstarted.asp
- https://rastalion.dev/mongodb-collection-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/