Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Pymongo

테스트 환경
  • 우분투리눅스 17.04
  • python 2.7.12
  • mongodb 2.6.11
mongodb는 설치했다고 가정한다. pymongo 패키지를 설치한다.
$ pip install pymongo
패키지가 제대로 설치됐는지 확인한다.
>>> import pymongo
MongoClient를 이용해서 몽고디비에 연결한다.
>>> from pymongo import MongoClient
>>> client = MongoClient('127.0.0.1', 27017)
혹은 URI 형식으로 데이터베이스 주소를 설정 할 수 있다.
>>> client = MongoClient('mongodb://127.0.0.1:27017')
>>> print client
MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)

데이터베이스 및 컬랙션 접근

하나의 MongoClient 인스턴스로 여러개의 데이터베이스에 접근 할 수 있다. Attribute 스타일과 딕셔너리 스타일이 있다. 아래 두 개 모두 "addressBook" 데이터베이스에 접근한다.
>>> db = client.addressBook
>>> db = client['addressBook']
앞서 만든 addressBook 데이터베이스에 컬랙션을 만들어보자. 데이터베이스와 마찬가지로 어트리뷰트 스타일과 딕셔너리 스타일로 접근 할 수 있다.
>>> collection = db.office
>>> collection = db['office']
데이터베이스와 컬랙션은 즉시 이루어지지 않는다. 실제 데이터에 대한 입/출력 작업을 실행 하면 그 때 접근이 이루어진다. 데이터베이스와 컬랙션이 없다면 새로 만들어진다.

문서 저장

몽고디비는 Json 스타일의 문서를 저장한다. Pymongo는 딕셔너리 형태의 데이터를 저장한다. 아래 예제를 보자.
>>> import datetime
>>> post = {"author": "Mike",
...         "text": "My first blog post!",
...         "tags": ["mongodb", "python", "pymongo"],
...         "date": datetime.datetime.utcnow()}

json 타입의 문자열을 파이선 타입(딕셔너리)으로 변환해서 저장하는 예제다.
import pymongo
import json
import datetime
from pymongo import MongoClient

client = MongoClient("localhost", 27017)
db = client.nlu
db.logging

mydata = """
{"name": "yundream", "age":35}
"""
d = json.loads(mydata)
d['date'] = datetime.datetime.utcnow()

postid = db.logging.insert_one(d).inserted_id

find_one() 으로 문서 하나 가져오기

nlu.logging에 저장된 데이터를 읽어오자.
import pymongo
import pprint
from pymongo import MongoClient

client = MongoClient("localhost", 27017)
db = client.nlu
pprint.pprint (db.logging.find_one())
{u'_id': ObjectId('595df7bb7870ae0e675e49c7'),
 u'age': 35,
 u'date': datetime.datetime(2017, 7, 6, 8, 41, 31, 851000),
 u'name': u'yundream'}
매개변수 없이 사용 할 경우 첫 번째 문서(가장 오래된 문서)를 가져온다. 매개변수를 입력할 경우, 일치하는 데이터 중 하나를 가져온다.
>>> pprint.pprint (db.logging.find_one({"name":"hani"}))
{u'_id': ObjectId('595f76027870ae60e400d454'),
 u'age': 38,
 u'date': datetime.datetime(2017, 7, 7, 11, 52, 34, 309000),
 u'name': u'hani'}

Object_ID 로 가져오기

mongodb shell에서 문서를 조회하면 "_id" 필드를 확인 할 수 있다. 문서를 식별하기 위한 유일한 값이다. _id 로 문서를 읽어보자.
>>> print (db.logging.find_one({"_id": '595df7bb7870ae0e675e49c7'}))
값이 나오지 않을 것이다. 웹 애플리케이션에서는 "_id"로 문서를 읽어오는 경우가 많다. 이때 _id는 ObjectId로 변환해서 사용해야 한다.
>>> from bson.objectid import ObjectId
>>> pprint.pprint(db.logging.find_one({"_id": ObjectId('595df7bb7870ae0e675e49c7')}))
{u'_id': ObjectId('595df7bb7870ae0e675e49c7'),
 u'age': 35,
 u'date': datetime.datetime(2017, 7, 6, 8, 41, 31, 851000),
 u'name': u'yundream'}

하나 이상의 문서는 find()

find_one()이 하나의 문서를 가져오니, find_many()로 여러개의 문서를 읽을 수 있을 것 같지만... 그냥 find()를 사용하면 된다.
>>> for log in db.logging.find():
...    pprint.pprint(log)
...
{u'_id': ObjectId('595df7bb7870ae0e675e49c7'),
 u'age': 35,
 u'date': datetime.datetime(2017, 7, 6, 8, 41, 31, 851000),
 u'name': u'yundream'}
{u'_id': ObjectId('595f76027870ae60e400d454'),
 u'age': 38,
 u'date': datetime.datetime(2017, 7, 7, 11, 52, 34, 309000),
 u'name': u'hani'}