Post List

2015년 8월 20일 목요일

MongoDB Study #24 MongoDB Python 연동하기 Tutorial

1. pymongo 설치


에서 다운로드 받으시면 됩니다.
Windows 용일 경우 설치된 Python과 같은 버전 , (32/64)bit 제품의 install 파일을 다운받으셔서 실행하면 됩니다.
Registry에 등록된 Python 과 버전 및 bit 정보가 다른 경우에는 설치가 되지 않습니다.

2. MongoDB Server 구동 및 Test Data 입력

아래 Posting을 참조하여 Server 구동 및 Test Data를 입력해 주세요.

MongoDB Server 구동 참조

Test Collection 입력

Test 편의를 위해서 employees 를 emp로 이름을 변경하였습니다.
(mongo 로 접속하여 db.employees.renameCollection("emp") 실행)

3. Python에서 MongoDB 연결
import pymongo
 
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017')
db = client['test']
MongoClient에 MongoDB Connection String을 넣어주면 됩니다.
따로 인자로 서버이름 , 포트 번호를 넣어줘도 됩니다.
db 도 client.test 형식으로 해도 됩니다.
Python은 MongoDB Client(Mongo.exe) 를 실행해서 Shell에서 수행했던 명령어들과 유사하게 동작하므로 쉽습니다.

4. Collection Data 조회 및 출력

이것 또한 client의 shell 명령어와 유사합니다.
cursor = db.emp.find()
 
for document in cursor:
    print(document)
 
cursor = db.emp.find( { "sal" : { "$gt":2000} }, {"_id":0 } ).sort("sal", pymongo.ASCENDING)
 
for document in cursor:
    print(document)
db.collectjon.find() 명령어로 기본적인 조회가 가능하고,
조회 조건 및 출력하는 Field List, sort 등의 명령어가 shell 명령어와 유사합니다.
MongoDB 의 findOne() 명령어 (하나의 Document를 Return) 는 find_one() 으로 실행하면 됩니다.

위 Code의 실행 결과 입니다.
{'sal': 2975, 'ename': 'JONES', 'job': 'MANAGER', 'empno': 7566, 'deptno': 20, 'hiredate': '02-04-1981', '_id': ObjectId('55d129a8257cf8fbc83b5ffc')}
{'sal': 800, 'ename': 'SMITH', 'job': 'CLERK', 'empno': 7369, 'deptno': 20, 'hiredate': '17-12-1980', '_id': ObjectId('55d129a8257cf8fbc83b5ffa')}
{'sal': 1250, 'ename': 'MARTIN', 'job': 'SALESMAN', 'empno': 7654, 'deptno': 30, 'hiredate': '28-09-1981', '_id': ObjectId('55d129a8257cf8fbc83b5ffb')}
{'sal': 1600, 'ename': 'ALLEN', 'job': 'SALESMAN', 'empno': 7499, 'deptno': 30, 'hiredate': '20-02-1981', '_id': ObjectId('55d129a8257cf8fbc83b5ffd')}
{'sal': 1250, 'ename': 'WARD', 'job': 'SALESMAN', 'empno': 7521, 'deptno': 30, 'hiredate': '22-02-1981', '_id': ObjectId('55d129a8257cf8fbc83b5fff')}
{'sal': 2450, 'ename': 'CLARK', 'job': 'MANAGER', 'empno': 7782, 'deptno': 10, 'hiredate': '09-06-1981', '_id': ObjectId('55d129a8257cf8fbc83b6000')}
{'sal': 2850, 'ename': 'BLAKE', 'job': 'MANAGER', 'empno': 7698, 'deptno': 30, 'hiredate': '01-05-1981', '_id': ObjectId('55d129a8257cf8fbc83b5ffe')}
{'sal': 3000, 'ename': 'SCOTT', 'job': 'ANALYST', 'empno': 7788, 'deptno': 20, 'hiredate': '13-06-1987', '_id': ObjectId('55d129a8257cf8fbc83b6001')}
{'sal': 5000, 'ename': 'PRESIDENT', 'job': 'CEO', 'empno': 7839, 'deptno': 10, 'hiredate': '17-11-1981', '_id': ObjectId('55d129a8257cf8fbc83b6002')}
{'sal': 1500, 'ename': 'TURNER', 'job': 'SALESMAN', 'empno': 7844, 'deptno': 30, 'hiredate': '08-09-1981', '_id': ObjectId('55d129a8257cf8fbc83b6003')}
{'sal': 1100, 'ename': 'ADAMS', 'job': 'CLERK', 'empno': 7876, 'deptno': 20, 'hiredate': '13-06-1987', '_id': ObjectId('55d129a8257cf8fbc83b6004')}
{'sal': 950, 'ename': 'JAMES', 'job': 'CLERK', 'empno': 7900, 'deptno': 30, 'hiredate': '03-12-1981', '_id': ObjectId('55d129a8257cf8fbc83b6005')}
{'sal': 3000, 'ename': 'FORD', 'job': 'ANALYST', 'empno': 7902, 'deptno': 20, 'hiredate': '03-12-1981', '_id': ObjectId('55d129a8257cf8fbc83b6006')}
{'sal': 1300, 'ename': 'CLERK', 'job': 'CLERK', 'empno': 7934, 'deptno': 10, 'hiredate': '23-01-1982', '_id': ObjectId('55d129a8257cf8fbc83b6007')}
{'sal': 2450, 'ename': 'CLARK', 'job': 'MANAGER', 'empno': 7782, 'deptno': 10, 'hiredate': '09-06-1981'}
{'sal': 2850, 'ename': 'BLAKE', 'job': 'MANAGER', 'empno': 7698, 'deptno': 30, 'hiredate': '01-05-1981'}
{'sal': 2975, 'ename': 'JONES', 'job': 'MANAGER', 'empno': 7566, 'deptno': 20, 'hiredate': '02-04-1981'}
{'sal': 3000, 'ename': 'SCOTT', 'job': 'ANALYST', 'empno': 7788, 'deptno': 20, 'hiredate': '13-06-1987'}
{'sal': 3000, 'ename': 'FORD', 'job': 'ANALYST', 'empno': 7902, 'deptno': 20, 'hiredate': '03-12-1981'}
{'sal': 5000, 'ename': 'PRESIDENT', 'job': 'CEO', 'empno': 7839, 'deptno': 10, 'hiredate': '17-11-1981'}

5. Insert

json 형식의 document를 변수로 생성 한 후
db.collection.insert(document) 명령어로 쉽게 입력이 됩니다.
import datetime
 
doc = { "id" : "LunaStar" , "firstname" : "Seokjoon" , "lastname" : "Yun" , "date" : datetime.datetime.utcnow() }
 
try:
    db.users.insert(doc)
except:
    print("insert failed", sys.exec_info[0])
 
docRet = db.users.find_one()
print(docRet)
{'lastname': 'Yun', 'firstname': 'Seokjoon', '_id': ObjectId('55d50f3ff867d619c0819a93'), 'date': datetime.datetime(2015, 8, 19, 23, 20, 31, 939000), 'id': 'LunaStar'}

6. Bulk Insert

json 형식의 document를 배열로 만든후 insert_many() 함수를 이용하면 됩니다.
docs = [ { "id" : "Banana" , "firstname" : "Nana" , "lastname" : "Bar" , "date" : datetime.datetime(2015, 12, 31) },
         { "id" : "Orange" , "firstname" : "Range" , "lastname" : "Oh" , "date" : datetime.datetime(2001, 2, 1) } ]
result = db.users.insert_many(docs)
print(result.inserted_ids)
print(db.users.find_one({ "_id" : result.inserted_ids[0] }, { "_id" : 0 } ) )
print(db.users.find_one({ "_id" : result.inserted_ids[1] }, { "_id" : 0 } ) )
[ObjectId('55d51074f867d619c0819a94'), ObjectId('55d51074f867d619c0819a95')]
{'lastname': 'Bar', 'firstname': 'Nana', 'date': datetime.datetime(2015, 12, 31, 0, 0), 'id': 'Banana'}
{'lastname': 'Oh', 'firstname': 'Range', 'date': datetime.datetime(2001, 2, 1, 0, 0), 'id': 'Orange'}

7. Index

따로 설명 없이 바로 예제를 보겠습니다.
from pymongo import ASCENDING, DESCENDING
 
db.emp.create_index( [ ("empno", ASCENDING) , ("sal" , DESCENDING) ] )
plan = db.emp.find( { "sal" : { "$gt" : 2000 } }, { "_id" : 0 } ).sort("empno").explain()
print(plan)
{'executionStats': {'nReturned': 6, 'executionSuccess': True, 'executionStages': {'needFetch': 0, 'works': 15, 'needTime': 8, 'nReturned': 6, 'stage': 'PROJECTION', 'executionTimeMillisEstimate': 0, 'saveState': 0, 'restoreState': 0, 'invalidates': 0, 'transformBy': {'_id': 0}, 'isEOF': 1, 'inputStage': {'needFetch': 0, 'works': 15, 'needTime': 8, 'nReturned': 6, 'docsExamined': 14, 'stage': 'FETCH', 'executionTimeMillisEstimate': 0, 'saveState': 0, 'restoreState': 0, 'filter': {'sal': {'$gt': 2000}}, 'alreadyHasObj': 0, 'invalidates': 0, 'isEOF': 1, 'inputStage': {'needFetch': 0, 'works': 14, 'needTime': 0, 'nReturned': 14, 'stage': 'IXSCAN', 'matchTested': 0, 'executionTimeMillisEstimate': 0, 'saveState': 0, 'indexBounds': {'empno': ['[MinKey, MaxKey]'], 'sal': ['[MaxKey, MinKey]']}, 'restoreState': 0, 'invalidates': 0, 'dupsTested': 0, 'keyPattern': {'empno': 1, 'sal': -1}, 'isMultiKey': False, 'seenInvalidated': 0, 'indexName': 'empno_1_sal_-1', 'isEOF': 1, 'dupsDropped': 0, 'direction': 'forward', 'advanced': 14, 'keysExamined': 14}, 'advanced': 6}, 'advanced': 6}, 'totalKeysExamined': 14, 'allPlansExecution': [], 'totalDocsExamined': 14, 'executionTimeMillis': 0}, 'queryPlanner': {'rejectedPlans': [], 'indexFilterSet': False, 'plannerVersion': 1, 'namespace': 'test.emp', 'winningPlan': {'inputStage': {'inputStage': {'indexName': 'empno_1_sal_-1', 'keyPattern': {'empno': 1, 'sal': -1}, 'stage': 'IXSCAN', 'direction': 'forward', 'indexBounds': {'empno': ['[MinKey, MaxKey]'], 'sal': ['[MaxKey, MinKey]']}, 'isMultiKey': False}, 'filter': {'sal': {'$gt': 2000}}, 'stage': 'FETCH'}, 'transformBy': {'_id': 0}, 'stage': 'PROJECTION'}, 'parsedQuery': {'sal': {'$gt': 2000}}}, 'serverInfo': {'gitVersion': '8bc4ae20708dbb493cb09338d9e7be6698e4a3a3', 'port': 27017, 'host': 'SJYUN-ATIV', 'version': '3.0.5'}}

8. Count
.count() 함수로 확인이 가능합니다.
print(db.emp.count())
print(db.emp.find({ "sal" : { "$gt" : 2000 } }).count())
14
6

위 예제들의 Full Source 입니다.


참고 :

댓글 없음:

댓글 쓰기