Python MongoDB 연결해서 사용해보기

오늘은 Python에서 MongoDB를 연결해주는 PyMongo에 대하여 알아보려 합니다.

개요

MongoDB는 NoSQL로서 dict 형태의 문서로 저장할 수 있는 데이터베이스이며, PyMongo는 MongoDB의 파이썬 드라이버입니다.

MongoDB 설치

apt-get install mongodb-clients mongodb-server

우분투의 경우에는 mongodb 클라이언트와 서버를 같이 설치합니다.

brew install mongodb

맥의 경우에는 brew를 이용하여 설치합니다.

mongod --config /usr/local/etc/mongod.conf

위 명령어를 터미널에 입력하면 해당 터미널이 꺼질 때까지만 mongodb 서비스가 구동됩니다.

brew services start mongodb

위 명령어를 터미널에 입력하면 로그인할 때마다 mongodb 서비스가 구동됩니다.

brew services stop mongodb

만약 mongodb 서비스를 중지하고 싶다면 stop을 하면 됩니다.

vim /usr/local/etc/mongod.conf

데이터베이스의 저장 위치를 바꾸기 위해서 mongod.conf 파일을 고칩니다.

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /Users/(사용자 이름)/data/db
net:
  bindIp: 127.0.0.1

storage의 dbPath를 원하는 위치로 변경합니다.

PyMongo 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

python -m pip install pymongo

pip로 PyMongo를 설치합니다.

실습

from pymongo import MongoClient

pymongo 패키지를 가져옵니다.

client = MongoClient('localhost', 27017)

localhost의 27017포트로 mongod 인스턴스와 연결합니다.

db = client.test_database
# or
db = client['test-database']

속성 스타일로 test_database라는 데이터베이스를 만듭니다.

속성 스타일 말고도 딕셔너리 스타일로 데이터베이스를 만들 수도 있습니다.

client.drop_database('test_database')

만약 데이터베이스를 지우려면 drop_database를 사용하면 됩니다.

user = {"name": "Kim",
        "birthday": 0000}

MongoDB는 JSON-스타일을 사용하므로 user라는 딕셔너리를 만듭니다.

users = db.users
user_id = users.insert_one(user).inserted_id

users라는 collection을 만들고, user 딕셔너리를 넣습니다.

print(user)

_id값을 딕셔너리에 넣지 않았지만, 자동으로 추가됨을 확인할 수 있습니다.

print(users.find_one())

find_one은 단일 문서를 반환합니다.

print(users.find_one({"name": "Kim"}))
print(users.find_one({"_id": user_id}))

특정 엘리먼트만을 이용하여 문서를 찾을 수 있습니다.

이전에 저장해둔 user_id로도 찾을 수도 있습니다.

user_many = [{"name": "Lee",
                    "birthday": 1111},
                   {"name": "Shin",
                    "birthday": 2222}]

user_ids = users.insert_many(user_many)

insert_many로 많은 딕셔너리 문서들을 넣습니다.

for i in users.find():
    print(i)

users의 많은 문서를 가져오려면 find를 사용하며, Cursor 인스턴스로 인하여 반복할 수 있습니다.

Written on April 4, 2019