20.04.09(Tue) pymongo로 MongoDB 제어하기

.·2020년 4월 9일
0

스파르타코딩클럽

목록 보기
13/14

1. mongo db 설치

맥 에서의 설치는 terminal 을 이용했다.
설치가 완료되어 localhost:27017 을 주소창에 입력후 들어가보면,

It looks like you are trying to access MongoDB over HTTP on the native driver port.

하얀 바탕 화면에 이런 문구가 떠 있다.

2. db의 종류와 구조

데이터 베이스의 종류에는 두 가지가 있다.

2-1. SQL (관계형)

RDBMS(Relational Database Management System)
: RDBMS는 관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어라고 정의할 수 있습니다.

(특징)

  • 모든 데이터를 2차원 테이블로 표현

  • 테이블은 row(record, tuple)과 column(field, item)으로 이루어진 기본 데이터 저장 단위

  • 상호관련성을 가진 테이블(table)의 집합

  • 만들거나 이용하기도 비교적 쉽지만, 무엇보다도 확장이 용이하다는 장점을 가짐

  • 데이터베이스의 설계도를 ER(Entity Relationship) 모델

  • ER모델에 따라, 데이터베이스가 만들어지며, 데이터베이스는 하나 이상의 테이블로 구성 됨. ER모델에서 엔티티를 기반으로 테이블이 만들어짐

출처: https://jwprogramming.tistory.com/52 [개발자를 꿈꾸는 프로그래머]

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다. 정해져 있는 컬럼, 정형화 되어 있다.
그래서 중간에 정해지지 않은 데이터를 넣을 수 없다. 대신 데이터가 일관적이며 분석에 용이하다는 장점이 있다고 한다.

2-2. No-SQL

흔히 NoSQL이라고 해서 아, SQL이 없는 데이터베이스구나! 라고 생각 할 수도 있겠지만, 진짜 의미는 Not Only SQL 이다. 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터저장소 이다.

단어 뜻 그 자체를 따지자면 "Not only SQL"로, SQL만을 사용하지 않는 데이터베이스 관리 시스템(DBMS)을 지칭하는 단어이다. 관계형 데이터베이스를 사용하지 않는다는 의미가 아닌, 여러 유형의 데이터베이스를 사용하는 것이다.

데이터를 조직하는 방법에는 리스트, 해시 테이블, 트리, 그래프 등의 다양한 방법이 있고 각각은 장점과 단점이 명확하기 때문에 단순히 NoSQL이라고만 해서는 너무 뜬구름 잡는 얘기가 된다. NoSQL이라는 단어는 RDBMS가 데이터베이스의 독점적인 지위를 차지하고 있는 현재 상황에 반발하는 정신을 담고 있다.

딕셔너리 형태로 데이터를 저장해두는 DB.
자유로이 데이터를 적재할 수 있다. 데이터마다 같은 값을 가질 필요가 없다. 단점은 일관성이 부족할 수 있다.

요약 : 대부분이 오픈 소스고, 21세기 초반에 개발되었으며 SQL을 사용하지 않는 Schema-less 데이터베이스.

3. MongoDB 의 구조

3-1. MongoDB 란?

NoSQL DBMS의 한 종류.

MongoDB는 NoSQL로 분류되는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다. MySQL 처럼 전통적인 테이블-관계 기반의 RDBMS가 아니며 SQL을 사용하지 않는다.

이름의 mongo는 humongous를 줄인 표현이다. 즉 '대빵 큰 DB' 라는 뜻.

MongoDB는 MySQL의 테이블과 같은 스키마가 고정된 구조 대신 JSON 형태의 동적 스키마형 문서를 사용하는데, 이를 MongoDB 에서는 BSON이라고 부른다.

MongoDB는 가장 기본적인 데이터를 Document 라고 부른다. 이는 MySQL같은 RDBMS에서는 row에 해당된다. 이 Document의 집합을 Collection이라고 하는데, RDBMS에서는 Table에 해당된다. Collection의 집합은 DB이고, 이는 RDBMS에서도 동일하다.

똑같은 조건으로 설계되었을 시 기존 RDBMS 속도보다 굉장히 빠르다는 장점이 있다. 이런 속도는 ACID를 포기한 댓가로 얻은 것이다. 따라서 데이터 consistency가 거의 필요 없고 조인 연산을 embed로 대체할 수 있는 경우에는 MongoDB가 확실한 대안이 될 수 있다. 반대로 저장하는 데이터가 은행 데이터 같이 consistency가 매우 중요한 작업에는 MongoDB를 쓰기 매우 힘들다.

요약 : 데이터베이스 아래에 (엑셀파일의 이름같이) collection (시트) 이 있다.
bamin 이라는 DB 아래에, user collection, restaurant collection 이 있다 식으로 해석.

3-2. MongoDB 의 모양새

4. pymongo

Python으로 Mongodb를 커넥션하여 사용할 때 가장 많이 사용하는 라이브러리가 바로 pymongo이다.

  • 기본 세팅
from pymongo import MongoClient           # pymongo를 임포트 하기(pymongo야 MongoClient를 꺼내줘)
client = MongoClient('localhost', 27017)  # mongoDB는 내 컴퓨터 내의 27017 포트로 들어가서 DB 와 연결해준다.
db = client.dbteddyjung                     # db이름은 내맘이다.
  • 데이터 넣어보기
# MongoDB에 insert 하기
# 'users'라는 collection에 아래 아이들을 넣어준다.
# 정보의 묶음들, 총 3개의 문서 이제 run 을 실행해 보자!
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'john','age':30})
  • run
    아무것도 뜨지 않는다. 데이터가 들어갔는지 눈으로 확인할 수 없다.

  • 코드를 입력

# MongoDB에서 데이터 모두 보기
# list(db.users.find()) : 전부 다 찾아내서 그걸 리스트 자료형으로 만들어줘!
all_users = list(db.users.find())

# 참고) MongoDB에서 특정 조건의 데이터 모두 보기
same_ages = list(db.users.find({'age':21}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기

for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)		    # 하나하나 돌면서 user 를 인쇄해줘!
  • 결과 확인
    두번 실행해서 두번 다 나왔다.
    장점이자 단점이기도 한 DB의 자유로운 적재.
    SQL 에서는 중복되는 Data 를 허용하지 않는다. MongoDB 에서는 중복되더라도 빨리빨리 유저에게 원하는 결과를 주는 방식을 채택하는 듯 하다.
{'_id': ObjectId('5e8e93cd627323eb47ed7a69'), 'name': 'bobby', 'age': 21}
bobby
{'_id': ObjectId('5e8e93cd627323eb47ed7a69'), 'name': 'bobby', 'age': 21}
{'_id': ObjectId('5e8e93cd627323eb47ed7a6a'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93cd627323eb47ed7a6b'), 'name': 'john', 'age': 30}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e6'), 'name': 'bobby', 'age': 21}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e7'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e8'), 'name': 'john', 'age': 30}

Process finished with exit code 0

profile
.

0개의 댓글