pymongo로 mongoDB 연결 + 조작HTML+CSS+JS+Flask/mongoDB+pymongo+크롤링2021. 6. 26. 13:04
Table of Contents
pymongo란?
- mongoDB라는 데이터베이스를 조작하려면 특별한 라이브러리인 pymongo라는 라이브러리가 필요하다.
- 기본 파이썬 라이브러리가 아니기 때문에 따로 설치를 하거나 pycharm professional을 사용하고 있으면 아래 링크를 참고하여 pymongo, dnspython를 설치하자.
- https://duckgugong.tistory.com/152
pymongo 템플릿
- mongoDB를 조작할 파이썬 파일을 생성한 후
- pymongo로 mongoDB를 조작하기 위해 아래 템플릿을 복사해서 사용하자. 외울필요 없음!
from pymongo import MongoClient # pymongo를 임포트 하기
client = MongoClient('연결할 URL') # Atlas에서 가져올 접속 정보
db = client.duck # 'duck'라는 이름의 db로 접속한다. 만약 없으면 자동으로 생성한다.
#코딩
pymongo로 mongoDB Atlas 연결하기
- 아래 링크로 들어가서 mongoDB와 Atlas를 설정하자
- https://duckgugong.tistory.com/158
- 연결할 DB에서 Connect를 선택하자
- Connect your application 선택
- DRIVER는 Python, VERSION은 3.6 or later 선택 후 복사버튼 클릭
- Close 클릭
- 위에서 복사한 내용을 수정해야한다.
mongodb+srv://duck:<password>@cluster0.f9x0w.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
- 위에 <password>를 Organization의 비밀번호(1234)로 바꾸고 myFisrtDatabase를 Cluster0으로 변경한다
- Cluster0은 위에서 생성한 Cluster의 이름이다!
- 수정하면 아래와 같다
mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority
- 수정한 내용을 pymongo 템플릿의 '연결할 URL' 내용에 넣어주자
from pymongo import MongoClient # pymongo를 임포트 하기
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority') # Atlas에서 가져올 접속 정보
db = client.duck # 'duck'라는 이름의 db로 접속한다. 만약 없으면 자동으로 생성한다.
#코딩
pymongo 기능 (insert / find / update / delete)
- pymongo의 기능들은 위의 템플릿 코드 아래에 작성해서 진행해보자!
insert_one
- mongoDB는 딕셔너리가 단순히 쌓이는 것이므로 단순히 딕셔너리를 mongoDB에 넣는 함수이다.
- 아래 코드는 'duck'이라는 데이터 베이스 안에 있는 users라는 collection에 doc라는 딕셔너리를 추가하는 경우이다.
- 'DB명'.'collection명'.insert_one(딕셔너리)처럼 사용하면 된다!
from pymongo import MongoClient # pymongo를 임포트 하기
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority') # Atlas에서 가져올 접속 정보
db = client.duck # 'duck'라는 이름의 db로 접속한다. 만약 없으면 자동으로 생성한다.
#코딩
doc = {'name':'duck','age':22}
db.users.insert_one(doc) #user라는 collection에 doc 딕셔너리 넣기. 다른 이름 사용해도 상관없다! 만약 collection이 없다면 생성됨.
- DB에 내용이 잘 들어갔나 확인하라면 Atlas에서 Browse Collectinos를 클릭하자
- duck이라는 DB가 생성되었다
- users라는 collection이 생성되고 위에서 넣은 딕셔너리가 Document로 추가되었다!
- Collection은 비슷한 것들끼리 모아둔 테이블이라고 생각하면 된다!
- Collection 안의 데이터 한 줄을 Document라고 한다!
find / find_one
- 아래와 같은 Collection이 있다고 하자
find
- find는 조건에 맞는 데이터를 모두 가져오는 함수이다.
만약 조건이 없다면 해당 collection에 있는 모든 데이터를 가져온다! - 나이가 25살인 사람을 찾아서 리스트에 넣어서 그 사람들의 정보를 출력해보자!
- 아래 코드에서 db.users는 duck이라는 DB에서 users라는 collections이고 {'age': 25}는 나이가 25살이라는 조건이고 {'_id': False}는 document마다 생성되는 고유한 값인 _id를 빼달라는 의미이다!
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
same_ages = list(db.users.find({'age':25},{'_id':False}))
print(same_ages)
[{'name': 'bobby', 'age': 25}, {'name': 'smith', 'age': 25}]
- 만약 {'_id': False} 조건을 빼면 어떻게 될까?
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
same_ages = list(db.users.find({'age':25}))
print(same_ages)
- 지저분한 _id 값이 나온다.
[{'_id': ObjectId('62603450c1bcc320e216e0ee'), 'name': 'bobby', 'age': 25}, {'_id': ObjectId('62603450c1bcc320e216e0ef'), 'name': 'smith', 'age': 25}]
- 만약 조건 없이 모든 데이터를 가져오고 싶으면 아래처럼 사용하면 된다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
same_ages = list(db.users.find({},{'_id':False}))
print(same_ages)
[{'name': 'duck', 'age': 22}, {'name': 'bobby', 'age': 25}, {'name': 'smith', 'age': 25}, {'name': 'jane', 'age': 21}]
find_one
- 조건에 맞는 데이터 하나만 가져오는 함수
- 만약 조건에 맞는 데이터가 여러개면 제일 collection에서 제일 위에 있는 조건에 맞는 데이터를 가져온다.
- 이름이 duck인 사람을 찾아서 출력해보자.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
user = db.users.find_one({'name':'duck'}, {'_id':False})
print(user)
{'name': 'duck', 'age': 22}
update_one
- 조건에 맞는 document를 하나 찾아서 원하는 내용으로 수정하는 함수이다.
- 이름이 'duck'인 사람의 나이를 26세로 변경해보자!
- 아래 코드에서 {'name':'duck'}은 이름이 'duck'인 사람을 찾는 것이고 {'$set':{'age':26}}은 나이를 26세로 변경하는 것이다!
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
db.users.update_one({'name':'duck'},{'$set':{'age':26}})
- 나이가 22세에서 26세로 변경된 것을 확인할 수 있다.
참고 : update_many
- 만약 update_one 대신 update_many를 사용하면 조건에 맞는 모든 데이터를 찾아서 변경하는 것이다!
delete_one
- 조건에 맞는 데이터를 하나 삭제하는 함수이다.
- 이름이 'duck'인 사람을 찾아서 삭제해보자.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
db.users.delete_one({'name':'duck'})
- name인 duck인 document가 삭제되었다!
sort
- 콜렉션을 정렬하는 메서드
- find 함수 뒤에 .sort('정렬할 기준')을 붙이면 콜렉션이 오름차순으로 정렬된다
- find 함수 뒤에 .sort('정렬할 기준', -1)을 붙이면 콜렉션이 내림차순으로 정렬된다.
사람들을 나이 기준으로 오름차순 정렬하면 아래와 같이 사용하면 된다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
users = list(db.users.find({}, {'_id': False}).sort('age'))
for i in users:
print(i)
{'name': 'jane', 'age': 21}
{'name': 'bobby', 'age': 25}
{'name': 'smith', 'age': 25}
내림차순은 아래와 같다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
users = list(db.users.find({}, {'_id': False}).sort('age', -1))
for i in users:
print(i)
{'name': 'bobby', 'age': 25}
{'name': 'smith', 'age': 25}
{'name': 'jane', 'age': 21}
drop
- 콜렉션을 삭제하는 메서드
- 아래처럼 사용하면 duck이라는 콜렉션이 삭제된다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://duck:1234@cluster0.f9x0w.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.duck
db.users.drop()
- users라는 collection이 삭제되었다!
'HTML+CSS+JS+Flask > mongoDB+pymongo+크롤링' 카테고리의 다른 글
크롤링한 데이터 mongoDB에 저장하기 (0) | 2022.04.21 |
---|---|
mongoDB + Atlas 설정 (0) | 2021.06.25 |
크롤링 (bs4) (0) | 2021.06.24 |
requests 라이브러리 (0) | 2021.06.17 |
프로젝트 생성 및 패키지 설치하기 (0) | 2021.06.17 |
@덕구공 :: Duck9s'
주니어 개발자에욤
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!