프로그래밍 일기 — MongoDB

배우는 자(Learner Of Life)
6 min readJul 12, 2023

--

유용한 데이터 마법 도구 익히기

#MongoDB, #No-SQL, #find, #insert, #delete, #update, #반복문

대표적인 no-sql 데이터베이스인 MongoDB를 계속 학습한다.(1)

어제까지 MongoDB라는 no-sql의 매우 유용한 마법도구에 대해서 배웠다. 그러나 기본 적인 동작과 설정만을 배웠을 뿐, 본격적으로 무언가를 아직 해보지 못했다. 따라서 이번에는 MongoDB를 이전에 진행한 웹 사이트 프로젝트와 연계하여 학습해 보는 것이 좋겠다는 판단이 들었다. 웹 상에서 출력할 데이터를 직접 DB에 저장하여 백엔드 처리를 하기 위해서다.

pymongo로 MongoDB를 가지고놀기

데이터 삽입(insert(), insert_one())

어제 pymongo라는 라이브러를 통해 python상에서 MongoDB와 상호작용할 수 있다는 것을 배웠다. 이번에도 다시 pymongo 를 통해 데이터베이스에 데이터를 입력하는 연습을 해 볼 것이다. 아래는 이전에 활용한 MongoDB에 데이터를 넣는 예제를 조금 발전시킨 것이다. 여러개의 데이터를 한꺼번에 입력한다.

# pymong 라이브러리의 MongoClient 클래스 가져오기
from pymongo import MongoClient

# 클래스를 인스턴스화(MongoDB Client의 URL 주소 입력)
client = MongoClient("mongodb+srv://conanmoon:cmst9917@cluster0.vsoy9sp.mongodb.net/mydb?retryWrites=true&w=majority")

# 인스턴스의 db를 객체화
db = client.mydb

# db객체의 컬렉션을 인스턴스화
collection = db.users

# 컬렉션에 데이터 넣기
doc_1 = {
"name": "철수",
"age": 35
}

doc_2 = {
"name": "영희",
"age": 34
}

doc_3 = {
"name": "하늬",
"age": 32
}

doc_4 = {
"name": "두리",
"age": 40
}

collection.insert_one(doc_1)
collection.insert_one(doc_2)
collection.insert_one(doc_3)
collection.insert_one(doc_4)
데이터베이스에 데이터가 입력된 것을 볼 수 있다.

데이터 검색(find(), find_one())

다음으로 입력된 데이터에서 원하는 데이터를 찾아본다. 바로 pymongo.find() 메서드를 활용하는 것이다. 처음에는 존재하는 모든 데이터를 검색해본다. {‘_id’:False}라는 부분은 _id 라는 필드를 보여주지 않는다는 것을 의미한다. 기본적으로 모든 MongoDB에 입력된 데이터는 이 필드를 가지게된다. 이 부분을 제외한 데이터의 다른 부분들을 보겠다는 의미이다. 아래 코드를 본래 예제에 추가한다. print() 를 활용하여 어떤데이터가 출력되는지 확인해본다.

#모든 데이터를 찾는다(.find()매서드 활용).
all_users = list(db.users.find({}, {'_id':False}))
print(all_users)

>>

[{'name': '철수', 'age': 35}, {'name': '영희', 'age': 34}, {'name': '하늬', 'age': 32}, {'name': '두리', 'age': 40}]
입력된 데이터가 모두 출력된다.

이번에는 모든 데이터를 반복문을 통해 출력해본다. 위 all_users 의 배열을 활용한다.

# 검색된 모든 유저의 이름과 나이를 반복문을 통해 출력한다.
for i in all_users:
print(i["name"], i["age"])

>>

철수 35
영희 34
하늬 32
두리 40

만약 데이터베이스의 가장 첫 데이터를 검색하고 싶다면, pymongo.find_one() 메서드를 활용할 수 있다.

# 맨 첫 데이터를 검색하기
user = db.users.find_one({})
print(user)

>>

{'_id': ObjectId('64ae6ded241f476c4b09939b'), 'name': '철수', 'age': 35}

데이터 수정(update(), update_one())

데이터를 수정하고자할 때는 .update() 메서드를 활용할 수 있다. 변경할 데이터를 명기하고, 그 데이터의 어떤 부분을 변경할 것인지를 명기한다.

# 철수의 나이를 39살로 수정한다.
# 키 'name'의 값이 '철수'인 데이터의 'age'의 값을 39로 바꾼다.
db.users.update_one({'name':'철수'},{'$set':{'age':39}})
철수의 나이 정보가 수정된 것을 알 수 있다.

데이터 삭제(delete_one())

잘 쓰이지않지만, 데이터를 삭제하는 .delete_one() 메서드도 활용할 수 있다.

# 데이터를 삭제한다.

db.users.delete_one({'name':'두리'})
‘두리'의 데이터가 삭제된 것을 알 수 있다.

심화 예제

그렇다면 데이터베이스 상의 한 데이터를 가지고, 그 데이터와 같은 값을 갖는 다른 데이터를 찾아보자. “좋.댓.구"라는 영화와 같은 평점을 가진 영화의 제목들을 출력해본다.

# 참조 기준으로 삼을 데이터를 정의
example_data = db.users.find_one({"title": "좋.댓.구"})

# 기준 데이터를 활용하여 같은 값을 갖는 다른 데이터를 검색
compare_data = db.users.find({'rate': example_data["rate"]})

# 데이터의 제목만을 반복문을 통해 출력
for i in compare_data:
print(i["title"])

>>

좋.댓.구
극장판 도라에몽: 진구와 하늘의 유토피아

참조:

(1) https://www.zymr.com/blog/survey-nosql-databases

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet