파이썬으로 mongodb를 사용하는 간단한 예제를 다뤄보려고 한다.
추후, flask, ajax를 함께 이용한다면 웹페이지를 손쉽게 만들 수 있다!
실생활에서 사용하는 웹서비스들은 데이터를 따로 저장해두는 데이터베이스가 존재한다! mongodb도 데이터베이스의 한 종류이다.
요즘 페이스북, 인스타와 같이 글로벌 서비스가 늘어나면서 방대한 양의 데이터를 빠른 속도로 처리할 수 있는 데이터베이스의 필요성이 급증하기 시작했다. 이런 대용량 서비스는 RDBMS에서는 처리하기 힘들다. 처리를 위해서는 데이터를 분산하기 위해서 수백 대의 서버로 분산시켜야 하기 때문에 비용적 문제가 크다. 또한 매번 데이터베이스 스키마에 맞게 데이터를 조작하고 작업해야 해서 비효율적인 측면도 있다.
Mongodb는 NoSQL(Not only SQL)의 한 종류로 이러한 문제를 해결하기에 적합한 데이터베이스이다. 기존 관계형 DBMS가 갖고 있는 특성뿐만 아니라, 분산 처리, 데이터 복제 등과 같은 다른 특성들을 부가적으로 지원하는 데이터 베이스이다.
용어 정리
- DataBase : 컴퓨터 시스템에 전자 방식으로 저장된 구조화된 정보 또는 데이터의 체계적인 집합
- DBMS : 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해 주고 데이터베이스를 관리해 주는 소프트웨어
- SQL : 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어
- RDB : 관계형 데이터 모델에 기초를 둔 데이터베이스, 관계형 데이터 모델이란 데이터를 구성하는데 필요한 방법 중 하나로 모든 데이터를 2차원 테이블 형태로 표현
- RDBMS : 관계형 데이터베이스를 생성하고 수정, 삭제 관리할 수 있는 소프트웨어
- NoSQL : 데이터 간의 관계를 정의하지 않음, 스키마가 없어 좀 더 자유롭게 데이터를 관리, 테이블과 같은 개념으로 컬렉션이라는 형태로 데이터를 관리
RDBMS 특징
- Colum, Row 형태로 데이터를 저장
- 데이터의 분류, 정렬, 탐색 속도가 빠름
- SQL 언어를 사용하여 정교한 검색 query를 통해 데이터를 관리
- 작업의 완전성을 보장
- 반드시 스키마에 맞춰야 함, 유연한 데이터 저장이 불가
- 분산이 어려움
NoSQL 특징
- 데이터 간 관계 정의를 하지 않음
- 용량 한계 극복을 위한 목적으로 등장하여 RDBMS보다 대용량의 데이터를 저장 가능
- 분산형 구조, 여러 대의 서버에 분산 저장
- 고정되지 않은 테이블
- key에 대한 put/get만 지원
- 스키마가 없어 규격화된 결과 값을 얻기 힘듦.
Pycharm에서 pymongo download하는 법
File -> Settings -> Project:{프로젝트명} -> Python Interpreter
pymongo가 인스톨되어 있는 것을 볼 수 있다. 만약 없다면 왼쪽 상단의 + 버튼을 눌러 pymongo를 검색한 후 Install Pacakge 버튼 클릭
ok 버튼을 누르고 설정을 빠져나온다.
기본 구조
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
기본적으로 이 코드는 반드시 적고 시작해야 한다. 그래야 mongodb와 연결된다!
저장(insert)
- insert_one() : 여러 개 한번에 저장
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 한 개 저장 - 예시
doc = {'name': 'bobby', 'age': 21}
db.users.insert_one(doc)
- insert_many() : 여러 개 한번에 저장
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 여러 개 저장 - 예시
docs = [{'name': 'bobby', 'age': 21},{'name': 'tim', 'age': 23}]
db.users.insert_many(docs)
찾기(find)
- find_one() : 한 개 찾기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 한 개 찾기 - 예시
user = db.users.find_one({'name': 'bobby'}, {'_id': False})
print(user)
{'name': 'bobby'} 는 key = 'name'의 value가 'bobby'인 것을 찾아라는 조건 입력문
{'_id': False} 는 id값을 제외하고 값을 받아오는 것이다, id는 랜덤 숫자이기 때문에 필요 없을 때가 많음
- find() : 여러 개 찾기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 여러개 찾기 - 예시
same_ages = list(db.users.find({}, {'_id': False}))
print(same_ages)
{} -> 조건이 없으니 저장된 값 모두 받아오라는 뜻
여기서 조심할 것은 꼭 list( ) 괄호안에 find를 넣어주어야 오류가 안난다!
변경하기(update)
- update_one : 한 개 바꾸기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 바꾸기 - 예시
db.users.update_one({'name': 'bobby'}, {'$set': {'age': 19}})
name이 bobby인 것의 age 값을 19로 바꿔라는 뜻
- update_many : 여러 개 바꾸기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 여러 개 바꾸기 - 예시
db.users.update_many({'name': 'bobby'}, {'$set': {'age': 77}})
name인 bobby인 모든 값의 age를 77로 바꾸기
update_many는 되도록 사용하지 않는 것을 추천한다!
지우기(delete)
- delete_one() : 한 개 지우기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 지우기 - 예시
db.users.delete_one({'name': 'bobby'})
bobby가 하나 사라졌다!
- delete_many() : 여러 개 지우기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbtest # dbtest라는 db에 접속할거다라는 뜻
# 여러 개 지우기 - 예시
db.users.delete_many({})
조건 없이 모두 지우기를 시도
update_many와 마찬가지로 delete_many는 자주 사용하지 않는 것이 좋다!
이렇게 간단한 조작법으로 mongodb를 파이썬으로 쉽게 다룰 수 있다.
'기타 공부들' 카테고리의 다른 글
[Python Flask] 플라스크와 AJAX로 DB에 이미지 업로드, 다운로드 (0) | 2021.11.03 |
---|---|
[JavaScript] 로컬 디렉토리 이미지 Base64로 인코딩하기 (0) | 2021.11.03 |
[Git] Pycharm과 Git 연동하기 (0) | 2021.11.03 |
[Javascript / CSS / HTML ] 내 컴퓨터에 저장된 이미지 업로드 하기(화면에 업로드된 이미지 보여주기) (0) | 2021.11.02 |
[Gitbash] Git 설치 및 사용법 (0) | 2021.11.01 |