brew tap mongodb/brew
brew install mongodb-community
실행
brew services start mongodb-community
아래와 같이 뜨면 서버가 잘 실행된 상태이다.
네이티브 드라이버로 접근하지 않고 HTTP로 접근했다는 뜻이다.
참고로 회사 컴은 맥, 집 컴은 윈도우이므로 나는 두 가지 방법을 모두 터득해야만 한 환경이었다. 집에서 할 땐 이렇게 했다.
mongod --install --serviceName MongoDB --serviceDisplayName MongoDB --dbpath C:\data\db --logpath C:\data\db\log\mongoservice.log --logappend
경로가 맞는지 잘 보고... 최초 설치 시 말고 이후에 또 작업할 땐 그냥 cmd에 mongod
만 치니까 됐다.
https://robomongo.org/download
참고로 Robomongo 즉 Robo 3T는 서비스가 중단되고 기존의 유료 서비스였던 Studio 3T가 무료로 전환되었다.
Robo 3T는 MongoDB를 그래픽으로 볼 수 있게 도와주는 GUI(Graphic User Interface)이다. 데이터베이스의 연결, 관리라는 것은 시각 요소가 따로 없이 추상적이기 때문에 이를 시각화하여 관리에 용이하게 해주는 프로그램인 듯 하다.
아래는 설치 후 첫 실행 상태다.
여기서부터 삽질을 좀 했다...
결론은 간단했다.
그리고 이 단계에서 mongoDB 조작을 돕는 pymongo라는 사실상 필수 라이브러리를 깔았는데, ... 여기서 또 삽질을 잠시 했다.
결론은 pycharm이 필요했단 거였다.
https://www.jetbrains.com/ko-kr/pycharm/download/#section=mac
OS에 맞게 설치 후 프로그램 실행, 내가 연습 작업하려는 로컬 폴더를 연결하였다.
아래는 설치 후 첫 실행 상태다.
맥 기준 상단 메뉴바에서 Pycharm > Preferences > 좌측 검색창에 interpreter 를 검색한다. 정상적인 Python 설치 과정을 거쳤다면 Python interpreter가 뜰 터이니...
해당 메뉴를 클릭하면 현재 깔려있는 파이썬 라이브러리가 뜬다. (나는 pymongo를 다 설치한 후 글을 작성하고 있으므로 감안 좀...)
패키지, 버전, 최신 버전을 알려주고 있는 메뉴바의 위에 있는 십자가 아이콘이 install 버튼이다. 눌러서 pymongo 검색 후 package install을 완료한다.
파이몽고를 import 해온 뒤 client, db를 선언하는 가장 기본적으로 선행되야 하는 코드를 넣는다.
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbjungle
여기서 dbjungle는 내가 자유롭게 설정한 DB 이름.
이걸 저장한 뒤 Run Python File 한다. (이걸 몰라 또 잠시 헤메였었다.)
그런 뒤 Studio 3T을 확인, refresh 하면...
위와 같이 내가 선언했던 dbjungle이 보이며,
insert시킨 {'name':'bobby','age':21}가 확인된다. 하하하...
기능 연습.
# 저장 - insert_one({k:v})
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'cane','age':27})
db.users.insert_one({'name':'john','age':30})
doc = {'name':'fret','age':50}
db.users.insert_one(doc)
# 한 개 찾기 - find_one({k:v})
user = db.변수.find_one({'name':'bobby'})
# 여러개 찾기 - list(db.변수.find({k:v},{'_id':False})) --> _id 값은 제외하고 출력
same_ages = list(db.변수.find({'age':21},{'_id':False}))
print(same_ages)
# 바꾸기 - update_one({k:v})
db.변수.update_one({'name':'john'},{'$set':{'age':19}})
# 지우기 - delete_one({k:v})
db.변수.delete_one({'name':'bobby'})
명령 실행시키는 순서는 다음과 같다:
db.변수.insert_one()
각 인물의 정보 DB에 추가하기,db.변수.find_one()
bobby 찾아서 변수 user에 저장하기,list(db.변수.find({k:v},{'_id':False}))
21살인 인물 모두 찾아 변수 same_ages에 저장 후 same_ages 콘솔에 출력하기,db.변수.update_one()
john을 찾아 $set
: 나이를 19로 업데이트하기,db.변수.delete_one()
bobby를 DB에서 삭제하기.위 명령에 대한 실행을 모두 마친 내 첫 데이터베이스, dbjungle의 모습은 다음과 같다.
네이버 영화 (https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303) 에서부터 웹스크래핑, 그 결과를 내 DB에 저장하도록 한다.
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbjungle
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser') # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')
# movies (tr들) 의 반복문을 돌리기
for movie in movies:
# movie 안에 a 가 있으면,
a_tag = movie.select_one('td.title > div > a')
if a_tag is not None:
rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
title = a_tag.text # a 태그 사이의 텍스트를 가져오기
star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기
# print(rank,title,star) 를 쓰는 대신,
doc = {
'rank' : rank,
'title' : title,
'star' : star
}
db.movies.insert_one(doc)
잘 저장되었다. 참고로 Studio 3T 화면의 좌측 어사이드 영역을 보면 아까 연습할 때 썼던 users 공간과 별개인 movies의 공간이 생성됨을 확인할 수 있다.
그렇다면 작업 환경에서 별개의 다른 파일을 만들어, '매트릭스'의 평점과 같은 평점의 영화 제목들만 가져와 본다.
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbjungle
## 코딩----------------------------------
target_movie = db.movies.find_one({'title':'매트릭스'})
target_star = target_movie['star']
movies = list(db.movies.find({'star':target_star}))
for movie in movies:
print(movie['title'])
하하하... 신기하다.