[용어 정리]
pymongo의 db는 RDBMS의 db와 동일하다.
collection은 RDBMS의 table에 대응된다.
document는 RDBMS의 row에 대응된다.
기본 transaction(insert, find, update, delete)을 사용하기 위해서 db와의 연결이 필요하다. 이 때 사용되는 것이 client 객체이다. 객체 생성에 필요한 인자들은 따로 정의되어 있으니 api 문서를 살펴보면 되겠다.
import pymongo
client = pymongo.MongoClient()
client 객체를 생성했으면 원하는 db에 접속한다. 두 가지 방법이 있다.
db = client.test_db
db = client['test_db']
test_db라는 이름을 갖는 db가 있으면 변수 db에 database 객체가 저장되지만 만약 존재하지 않을 경우 아무일도 일어나지 않는다. 이 점은 pymongo의 중요한 특징인데 실제로 insert를 통해 document가 하나 저장되어야 비로소 객체가 생성된다. (이는 collection도 마찬가지이다)
원하는 db를 불러왔으면 collection을 불러온다. 이 역시 두 가지 방법이 있다.
collection = db.test_collection
collection = db['test_collection']
[예제]
db는 회사, 각각의 collection은 부서를 나타낸다고 가정하자. 회사 내의 직원의 정보를 저장하는 데이터베이스를 구축하는 것이 목표이다.
db = client['my_company']
collection = db['HR']
[Insert]
회사 내 인사팀에 새로운 신입이 들어왔다. 사번은 202219, 이름은 홍길동이고 나이는 26세, 사는 곳은 부산이다.
이 직원의 정보를 회사 db에 추가해보자.
collection.insert_one({
'id': 202219,
'name': '홍길동',
'age': 26,
'resident': '부산'
})
[Update]
2022년이 가고 2023년이 되었다. 사원 홍길동의 나이도 어느덧 27세가 되었다. 회사 db에서 이 직원의 나이를 수정해보자.
collection.update_one({'id': 202219}, {'$set': {'age': 27}})
사번이 202219인 직원의 나이를 27로 설정한다는 뜻이다.
다음의 SQL문과 같은 의미를 가진다.
UPDATE HR SET age = 27
WHERE id = 202219
$set 자리에는 다양한 갱신 제한자가 올 수 있다. 작용되는 범위는 document 내에서만 한정된다.
$set | 명시한 필드를 명시한 값으로 설정 |
$inc | 명시한 필드의 값을 명시한 값만큼 증가 |
$push | 해당하는 document가 존재하면 명시한 필드와 값을 새로운 열로 추가 해당하는 document가 존재하지 않으면 새로운 document를 생성하고 필드와 값 추가 |
$unset | 명시한 필드와 값을 모두 제거 |
자주 쓰이는 건 $set과 $inc 정도이고 다른 종류도 많이 있으니 다음 글을 참고하면 될 듯 하다.
https://thalals.tistory.com/169
[MongoDB] 특정 값 증가 - Update 메소드와 $inc 제한자 ( 조회 수, 좋아요)
몽고디비에서 Update 메소드를 사용할 때 값을 수정하기위해 $set을 이용하는데, 이 set이 제한자이다. 제한자의 종류는 다양하고 기능 또한 다양합니다. 제한자의 구체적인 용어는 '갱신 제한자'로
thalals.tistory.com
[Find]
사번은 [연도] + [들어온 순서]로 결정된다. 홍길동보다 앞서 들어온 직원의 정보가 궁금하다. 찾아보자.
document = collection.find_one({'id': 202218'})
print(document['name'])
[Delete]
오랜 야근으로 더 이상 버티기 힘들어진 홍길동 사원은 그만 퇴사해버리고 만다. 회사 db에서 이 직원의 데이터를 삭제하자.
collection.delete_one({'id': 202219})
'개발일지 > Python' 카테고리의 다른 글
[Python] Call-by-value vs Call-by-reference (0) | 2023.11.16 |
---|