스파르타 웹개발 종합반 3주차 - pymongo로 DB 조작해보기

이전에 추가한 데이터에서 다른 데이터를 몇개 더 추가했다.

세명의 데이터를 더 추가 한뒤에 실습을 시작했다.

데이터 가져오기

from pymongo import MongoClient
import certifi
ca = certifi.where()

client = MongoClient('mongodb+srv://test:[email protected]/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca )
db = client.dbsparta


all_users = list(db.users.find({},{'_id':False}))


for user in all_users:
    print(user)

list(db.users.find({},{'_id':False})) db 에 있는 데이터를 모두 꺼내온다. 단, _id 값은 빼고 보낸다는 뜻이다.

만약에 저 조건을 추가하지 않고 실행을 하면

{'_id': ObjectId('62089f9d6631734a76471285'), 'name': 'bob', 'age': 27}
{'_id': ObjectId('6208a347cdc799239dbe2aa4'), 'name': 'bob', 'age': 27}
{'_id': ObjectId('6208a348cdc799239dbe2aa5'), 'name': 'john', 'age': 20}
{'_id': ObjectId('6208a348cdc799239dbe2aa6'), 'name': 'ann', 'age': 20}

이렇게 나오는데 _id값을 빼고 보내면

{'name': 'bob', 'age': 27}
{'name': 'bob', 'age': 27}
{'name': 'john', 'age': 20}
{'name': 'ann', 'age': 20}

데이터의 정보만 출력되는 모습을 볼 수 있다.

단일 데이터 가져오기

하나의 데이터만 빼오고 싶으면
user = db.users.find_one({'name':'john'}) 이렇게 find_one 이라는 문구를 사용한다.

user = db.users.find_one({'name':'john'})

print(user)

이렇게 실행을 하면

{'_id': ObjectId('6208a348cdc799239dbe2aa5'), 'name': 'john', 'age': 20}

하나의 값만 출력되는것을 볼 수 있다.

데이터 변경하기

데이터베이스에 있는 데이터의 내용을 변경하고 싶다면 update를 사용한다.

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

name 값이 bobby인 데이터의 age 값을 19로 수정을 한다.

데이터 삭제하기

데이터베이스에 있는 데이터의 내용을 지우고 싶다면 delete를 사용한다.

db.users.delete_one({'name':'bobby'})

name 값이 bobby 인 데이터를 삭제한다.

데이터가 사라졌다.

정리

from pymongo import MongoClient
import certifi
ca = certifi.where()

client = MongoClient('mongodb+srv://test:[email protected]/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca )
db = client.dbsparta


# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

연습

이전에 크롤링해서 출력해봤던 영화의 랭킹과 이름과 평점을 db에 넣어보는 코드를 구현했다.

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
import certifi
ca = certifi.where()

client = MongoClient('mongodb+srv://test:[email protected]/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca )
db = client.dbsparta

#유저가 부른 것처럼 하기 위한 header 속성
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.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')


# 코딩 시작

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
movies = soup.select('#old_content > table > tbody > tr')

#old_content > table > tbody > tr:nth-child(2) > td.point
for movie in movies:
    a = movie.select_one('td.title > div > a')
    img = movie.select_one("td:nth-child(1) > img")
    point = movie.select_one("td.point")
    if a is not None:
        title = a.text
        rank = img['alt']
        star = point.text
        doc = {
            'title' : title,
            'rank' : rank,
            'star' : star
        }
        db.movies.insert_one(doc)

doc에 title과 rank와 star의 값은 이전에 크롤링해서 얻은 데이터로 지정하고, 반복문으로 수행하기 때문에 하나씩 추가해주는 구문을 작성한다.db.movies.insert_one(doc)

좋은 웹페이지 즐겨찾기