Backend/MongoDB

MongoDB - CRUD

yxemsy 2022. 2. 1. 21:37

MongoDB에서 CRUD하기 전에

MongoDB의 기본 구조 먼저 알아야한다.

MongoDB의 기본구조

  • Document: 관계형 데이터베이스의 행(row)에 해당한다.
  • Collection: 관계형 데이터베이스의 테이블에 해당한다.
  • Database: 관계형 DB의 테이블과 같은 개념

→ Document가 모여 Collection을 이루고, Collection이 모여 Database를 이룸

 


  • Pymongo

pymongo란 mongoDB를 사용할 수 있게 해주는 파이썬 모듈이다.

다음과 같이 불러온다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
# 27017은 mongoDB 기본포트

  • 도큐먼트 생성

이번에는 데이터베이스에 접속하여 컬렉션에 도큐먼트를 저장해보자.

(만약 만들어진 DB나 Collection이 없으면 불러들인 이름으로 자동생성됨)

db = connection.get_database("myDB") # myDB라는 DB에 접근
collection = db.get_collection("myCollection") # myCollection이라는 Collection에 접근
collection.insert_one({ "name": "hayan" }) # collection에 document 저장

1) connection.get_database("DB이름")를 사용하여 DB에 접속

2) collection이라는 변수에 db.get_collection("collection이름") 저장하여 컬렉션 생성

3) insert_one({"field" : "value"}) 사용하여 document 추가

 

 

여러 도큐먼트를 한번에 삽입하려면 insert_many() 사용하면 된다.

result = collection.insert_many(
	[{"name":"hayan"}, { ... } ... ]
)
print(result.inserted_ids) # 입력된 도큐먼트들의 id값들을 출력

여기서 inserted_ids는 도큐먼트의 객체 id값을 가진다.

ObjectId 값은 ObjectId('542c2b97bac059498b48006')의 형식을 가지며 유일한 값이다.

Primary Key 라고 생각하면 좋다.

 

  • 만들어진 데이터베이스, 컬렉션, 도큐먼트 확인
print(connection.list_database_names()) # DB 목록 조회
print(db.list_collection_names()) # 컬렉션 목록 조회

1) list_database.names(): DB 목록을 가져옴

2) list_collection_names(): Collection 목록을 가져옴

 


  • 도큐먼트 조회
print(list(collection.find(
	{query},
        {projection}
)))

1) collection이름.find() 를 사용하여 컬렉션 내의 도큐먼트 조회가 가능하다.

 

2) list 명령어는 커서를 활용하여 모든 데이터를 불러온다.

   - 커서란? 쿼리 결과에 대한 포인터로, 도큐먼트의 위치 정보를 반환

 

  • Query와 Projection

Query: 원하는 정보를 검색하기 위해 표현하는 내용

Projection: 그 field를 보여줄지 말지를 결정 (true이면 보여주고, false면 안 보여줌)

user.find(
	{"name" : "hayan"} # find함수 내에 찾고자하는 query 작성
)

위와 같이 작성한다면, name이 "hayan"인 Document가 모두 반환된다.

user.find(
	{"name" : "hayan"} # find함수 내에 찾고자하는 query 작성
    	{"age" : False } # age의 projection 값을 False로 설정
)

위와 같이 작성한다면, name이 "hayan"인 사용자의 age 필드는 보여주지 않는다.

 


  • 도큐먼트 수정
result = collection.update_many(
	{ query },
    	{ update },
         upsert:Boolean
)
print(result.matched_count) # 찾은 도큐먼트 수 출력
print(result.modified_count) # 변경된 도큐먼트 수 출력

collection이름.update_many() 를 사용하여 한 번에 여러 값을 수정할 수 있다.

 

user.update_one( # update_one은 하나의 쿼리 수정
	{"name": "hayan"},
    	{"$set": {"age": 25} } 
)

위 코드는 name이 hayan인 사용자의 나이를 25로 수정하는 것이다.

어떤 필드의 값을 수정하기 위해 update문을 작성할 때는

$set 연산자를 사용하여야 한다. 

 

만약! 쿼리에 작성된 <"필드">:<"값">에 대한 document가 존재하지 않는다면,

새로 추가된다.

 

나중에 추가적으로 포스팅 하겠지만, 연산자 기본구조는

{"$연산자" : {"필드": 값}} 이다.

 

user.update_one( # update_one은 하나의 쿼리 수정
	{"name": "hayan"},
    	{"$unset": {"age": True} } 
)

위 코드는 name이 hayan인 사용자의 age 필드를 제거하는 것이다.

$unset 연산자를 사용하여 값은 True(제거)를 준다.

 


  • 도큐먼트 삭제
result = collection.delete_one(
	{ query }
)
print(result.deleted_count) # 삭제된 도큐먼트 수 출력

만약 다수의 도큐먼트를 삭제하고 싶으면 delete_many()를 사용하면 된다.

user.delete_one(
	{"name" : "hayan"}
)

위 코드는 name 필드의 값이 hayan인 document를 삭제한다.