Thumbnail image from DALL-E
이번에 구현할 기능은 다음과 같다.
- 이전처럼 JSON 파일로 저장하지 말고, MongoDB를 설치해서 (
localhost
) MongoDB에 저장한다.
- 이전에 JSON 으로 저장한 방식은 더 이상 쓸 일이 없나? 그렇다!
- 물론 DB 조회 시에도 MongoDB에서 조회 (
Find
) 한다.
- 그럼 이전에 만든 SQLite의 조회 기능은 필요가 없나? 그대로 냅둬도 되나??
- 즉 유튜브 정보 (
link
,title
,vid
,cid
) 는 sqlite 에, JSON은 MongoDB 에 저장 (Upsert
) 하자!
- MongoDB 에는 json 만 저장 (
Upsert
)하고, sqlite 에는 json 저장하지 않아요
NoSQL
- Not Only SQL 또는 Nonrelational Operational Database SQL의 약자. 표준화된 구조적 질의 언어가 없는 데이터베이스 또는 관계를 갖지 않는 데이터베이스들을 뜻한다. 키-벨류 / 도큐먼트 / 컬럼 패밀리 / 그래프 DB 등 4가지 종류의 NoSQL이 있다. 관계형 데이터베이스와 달리 NoSQL은 그 안에도 종류가 있다.
Document DB
- 필드와 값 형태로 구성된 데이터를 JSON 포맷으로 관리하는 데이터베이스.
MongoDB는 NoSQL 데이터베이스의 일종으로, 문서 지향적(document-oriented)이다.
비 트랜잭션
데이터 입출력시 JSON(JavaScript Object Notation)형태, 데이터 저장시 BSON(JSON데이터를 이진 형식으로 인코딩한 포멧)형식을 사용
데이터 저장 방식: 데이터는 JSON과 유사한 BSON 형식의 '문서'로 저장됩니다. 몽고DB는 JSON과 같은 동적 스키마형 도큐먼트들(몽고DB는 이러한 포맷을 BSON; Binary JSON 이라 부름) 을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다.
pymongo
를 사용하여 MongoDB에 데이터를 저장할 때, JSON 데이터를 BSON(Binary JSON) 형식으로 변환할 필요는 일반적으로 없습니다. pymongo
라이브러리는 자동으로 Python의 딕셔너리를 MongoDB의 BSON 형식으로 변환합니다. 이는 MongoDB가 내부적으로 BSON 형식을 사용하기 때문입니다.
검색속도가 빠름
인코딩 디코딩이 필요함
고유의 DML(데이터 조작어)를 갖고있다(Javascript 기반 명령어 & JSON을 도큐먼트 인자로 사용)
별도의 스키마 선언 없이 도큐먼트의 필드를 자유롭게 추가 및 삭제할 수 있다(유연성 & 스키마 메타데이터가 없다)
MongoDB가 자동으로 시작되지 않는 경우, 터미널이나 명령 프롬프트에서 mongod
명령을 사용하여 서버를 시작합니다. PyCharm의 Python 인터프리터 설정이 올바른지 확인하세요. 다른 프로젝트나 가상 환경을 사용 중이라면, 해당 환경에 pymongo
가 설치되어 있는지 확인해야 합니다.
MongoDB Compass는 MongoDB의 GUI 도구로, 데이터베이스 관리 및 데이터 확인에 유용합니다. MongoDB Compass 다운로드 페이지 에서 다운로드하여 설치할 수 있습니다.
참고로 MongoDB Atlas 라는 클라우드를 사용할 수도 있지만 우리는 localhost 로 하기 때문에 생략헸습다!
Python 스크립트에서 MongoDB 데이터베이스 및 컬렉션을 생성할 수 있습니다. PyCharm에서 새 Python 파일을 만들고 다음 코드를 작성합니다.
from pymongo import MongoClient
# MongoDB 서버에 연결
client = MongoClient('mongodb+srv://username:pw@DBname.6gqmx3x.mongodb.net/')
# 데이터베이스 생성 (없으면 자동 생성)
db = client['example_database']
# 컬렉션 생성 (없으면 자동 생성)
collection = db['example_collection']
아래는 JSON 데이터를 MongoDB 컬렉션에 저장하는 예시 코드입니다.
# 저장할 JSON 데이터
data = {
"name": "John Doe",
"age": 30,
"address": "123 Main St"
}
# 데이터 삽입
result = collection.insert_one(data)
print(f"Document inserted with _id: {result.inserted_id}")
CRUD(Create, Read, Update, Delete) 기본 형식 은 다음과 같습니다.
insert
/ find
/ update
/ delete
아래 두 코드를 비교해보자
# MongoDB에 채널 정보 저장
mongo.collection.insert_one({
"channel_id": channel_id,
"videos": video_info
})
print(f"채널 ID {channel_id}와 각 동영상의 정보가 MongoDB에 저장되었습니다.")
return [video['link'] for video in video_info]
# MongoDB에 채널 정보 저장 (upsert 사용)
mongo.collection.update_one(
{"channel_id": channel_id},
{"$setOnInsert": {"videos": video_info}},
upsert=True
)
print(f"채널 ID {channel_id}의 정보가 MongoDB에 저장되었습니다.")