본문 바로가기
개발(Develop)/데이터베이스(DB)

데이터베이스(DB)/ 파이썬(Python)으로 몽고DB 조작하기/ pymongo 라이브러리로 데이터베이스 조작하기/ Robo 3T, mongoDB, 파이참, CRUD

by 왁왁s 2021. 6. 1.
데이터베이스 mongoDB(몽고DB)를 파이썬으로 조작하기

 

파이썬으로 몽고DB를 다루기 위해서는 

'pymongo'

라는 파이썬 패키지를 설치해주어야 한다.

 

만약 파이썬 코드를 작성하는 IDE

'파이참(Pycharm)'이 안 깔려있다면 ▼

파이참(PyCharm) 쉬운 설치/ Pycharm IDE 다운로드/파이참(PyCharm)이란?/ IDE 추천

 

파이참(PyCharm) 쉬운 설치/ Pycharm IDE 다운로드/파이참(PyCharm)이란?/ IDE 추천

파이참(PyCharm)이란? 파이참(PyCharm)은 이전에 다뤘던 Visusal Studio Code와 유사하게 개발자가 소프트웨어를 쉡게 개발할 수 있도록 개발환경을 제공하는 코드 편집기이다. 그러나 파이참은 IDE(Integrate

parkjh7764.tistory.com


만약 파이참은 깔려있는데,

파이참에서 파이썬 라이브러리 설치하는 방법을 모르겠다면 ▼

 파이참(PyCharm) 패키지 설치하기/ 파이참 패키지 설치 시 pip 오류 완벽 해결법

 

파이참(PyCharm) 패키지 설치하기/ 파이참 패키지 설치 시 pip 오류 완벽 해결법/ 파이썬 가상환경이

파이썬은 라이브러리가 방대한 것으로 잘 알려져있다. 라이브러리(library)란? 네이버에 '라이브러리'를 검색했을 때 볼 수 있는 정의이다. 라이브러리란, 컴퓨터 프로그램에서 자주 사용되는 부

parkjh7764.tistory.com


파이썬 패키지를 설치하는 방법을 알고 있다면

아래의 Setting -> 'Available Packages' 검색창

'pymongo'를 검색하여

Install 해준다.

 

Install 버튼을 누르고 3~5초 정도 기다려준다.

성공적으로 패키지가 설치 되었다면

아래와 같이 Package 부분에 'pymongo'가 나타난다. 


이전에 다뤘던 requests 패키지, beautifulsoup4 패키지와 마찬가지로

pymongo 패키지 또한 사용에 필요한 기본 골격 코드가 있다.

 

'pymongo' 라이브러리 기본 골격 코드

 

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# 여기서부터 코드 작성

 

그럼 바로 기본 골격을 활용해 코드를 작성해보자.

 

pymongo 라이브러리를 사용해서 파이썬으로 mongoDB를 조작해볼 것이다.

그 전에 pymongo 라이브러리의 명령어 몇 개를 알아둬야 한다.

 

insert_one, find_one, update_one, delete_one 등등이 있다.

 

이를 줄여서 CRUD라고 부른다.

C : insert_one, insert_many

R : find_one, find

U : update_one, update_many

D : delete_one, delete_many

 

 

영어 단어로 해석해도 어떠한 기능을 하는지 유추해볼 수 있을 것이다.


그럼 먼저 insert_one(삽입)에 대해 알아보자.


insert_one (삽입) 코드

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# insert 사용해보기
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

pymongo 기본 골격 아래에 insert_one 명령어를 추가하였다.

코드 설명

from pymongo import MongoClient

: pymongo 패키지를 사용하기 위해 임포트해주는 것이다.

 

client = MongoClient('localhost', 27017)

mongoDB는 기본으로 27017 포트로 작동이 된다. 다른 포트 주소를 넣어도 된다.

기본 포트인 27017을 통해 localhost에 접속을 하여 접속된 객체를 'client'로 받는 것이다.

 

db = client.dbhwanE

는 데이터베이스를 생성하는데 이름을 'dbhwanE'라고 한다는 것이다.

dbhwanE라는 이름의 데이터베이스가 없다면 자동으로 생성된다.

 

doc = {'name':'bobby','age':21}

mongoDB는 딕셔너리가 쌓이는 것이기 때문에 

딕셔너리 형태의 도큐먼트(document, 문서)를 만들어 doc에 넣는다.

 

db.users.insert_one(doc)

users라는 이름의 컬렉션을 생성하고, 거기에 doc에 들어가 있는 데이터를 db에 '삽입'한다.

여기서 컬렉션은, 비슷한 데이터끼리 나누어 담기 위한 카테고리라고 생각하면 좋다.

 

순서는 pymongo 라이브러리 import → mongoDB 포트 주소로 접속 → 사용할 데이터베이스 이름와 컬렉션 생성

 

Robo 3T로 확인해주기

 

mongoDB를 GUI로 제공해주는 Robo 3T를 열었을 때 

'dbhwanE'라는 데이터베이스가 생성된 것을 확인할 수 있다.

 

그리고 dbhwanE를 더블클릭 했을 때 컬렉션을 볼 수 있는데,

거기에는 추가한 users란 이름의 컬렉션이 생긴 것을 확인할 수 있다.


그리고 users 컬렉션에는 우리가 딕셔너리 형태로 넣은 데이터가

key값과 value 값으로 들어가 있는 것을 확인할 수 있다.

insert 에 들어가는 데이터 값을 바꿔주고 파이참에서 계속 실행해준다면

mongoDB에 데이터가 쌓이게 된다.

아래는 21살 bobby, 23살 john, 27살 smith가 데이터베이스에 들어가 있는 모습이다.

Robo 3T 우측 상단에 동그라미 친 부분을 누르게 되면 보는 방식을 바꿀 수도 있다.

아래와 같이 테이블(표) 형식으로 한 눈에 알아보기 쉽게 바꿀 수가 있다.


find (찾기) 코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# find 사용해보기
same_ages = list(db.users.find({'age':21},{'_id':False}))
print(same_ages)

코드 실행 결과

 

코드설명

same_ages = list(db.users.find({'age':21},{'_id':False}))

{ } 괄호에 '특정 조건'을 작성하고 해당 조건을 만족하는

데이터들을 가져와(find)서 same_ages라는 변수에 넣는 것이다. 그것도 list의 형태로...

 

{ } 괄호 안에 조건을 보게 되면 { 'age' : 21 }는 age(나이)의 값이 21 것을 말한다.

그리고 { '_id' : False } 'id 값을나타내지 말아라'라는 조건이다.

 

여기서 'id 값'이란 Robo 3T에서 다시 확인을 하면 _id가 데이터들과

함께 생성된 것을 확인할 수 있다.

이것은 '자동으로 생성되는 무작위의 하나 밖에 없는 값'이다


만약에

{'_id':False} 를 작성하지 않는다면 _id 값도 결과 값에 출력되어 조금 지저분(?) 해진다.


그리고 위의 코드처럼 '21살'이라는 조건을 넣지 않고

모든 데이터들을 출력하고자 한다면 

아래와 같이 조건문 부분을 { } 비어있는 중괄호로 작성해주면 된다.

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# find 사용해보기
same_ages = list(db.users.find({},{'_id':False}))

for person in same_ages:
    print(person)

 여기서 for 문을 작성한 이유는 캡처하기 편하게

출력 값을 한줄 한줄 나타내기 위함이니 신경 안 써도 된다.


find조건을 사용해 여러 데이터를 가져올 때 사용하는데

 

데이터 하나만을 가져올 때find_one을 사용한다.

 

find_one 코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# find_one 사용해보기
user = db.users.find_one({'name':'bobby'})
print(user)

 

find_one이라는 이름에서 알 수 있듯이 

'하나만(one) 찾아라(find)'. 즉 하나의 데이터만 가져오는 것이다.

find_one({'name' : 'bobby'})는 bobby라는 이름의 데이터가 여러 개 있어도

맨 위에 저장된 값 '하나만'을 가져오는 것이다.

 

그리고 위의 출력 값에서 _id 값은 출력하지 않으려면

user = db.users.find_one({'name':'bobby'}, {'_id':False})

{'_id':False}를 추가해주면 된다.


그 다음은 update (업데이트)이다.

update_one (업데이트) 코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# update_one 사용해보기
db.users.update_one({'name':'bobby'},{'$set':{'age':3}})

 

※update_one 코드 실행하기 전※

 

※update_one 코드 실행한 후※


코드 설명

db.users.update_one({'name':'bobby'},{'$set':{'age':3}})

키(key) 값이 name, 그러니까 이름이 'bobby'인 사람을 찾아서 나이를 3으로 업데이트(수정)해라.

 

 

 

※주의해야할 점

$set을 붙이지 않을 경우 age만 바뀌는 것이 아니라,

기존에 있던 정보까지 모두 사라지게 된다. 

파이참에서 실행할 경우엔 오류를 발생시킨다.

 

만약 bobby 이름을 babo로 개명해서 데이터베이스를 바꿔달라고 하면

db.users.update_one({'name':'bobby'},{"$set":{'name':'babo'}}) 

이렇게 작성하면 된다.

 

또, update_many 가 있다.

이는 조건에 맞는 것을 모두 찾아서 바꿔주는 것인데, 잘 사용하지는 않는다. 

모두 한번에 바꾼다는 것은 데이터베이스에 있어서 위험(?)하기 때문이다.... 

이것과 마찬가지로 delet_many( )가 있다. 매우 위험하다.


delet_one (삭제하기) 코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbhwanE

# delete_one 사용해보기
db.users.delete_one({'name':'babo'})

아까  bobby를 babo로 수정했기 때문에

bobby가 아닌 babo를 삭제해보자.

 

※delete_one 코드 실행하기 전※

※delete_one 코드 실행한 후※


데이터베이스에 있던 이름이 babo인 데이터가

사라진 것을 확인할 수 있다.

댓글