파이썬으로 MongoDB에 연결해서 CRUD를 구현해볼 것이다. 시작 전 Pymongo 라이브러리가 설치 되어있어야한다.
import pymongo
connection = pymongo.MongoClient() # 주소를 쓰지 않을 경우 무조건 27017로 접속. aws를 쓸 경우 ('mongodb://ip주소')
db_test = connection.test # db = connection["test"] 데이터베이스 없으면 만들어 짐
print(db_test) # Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test')
pymongo를 import하고 MongoClient() 메소드를 사용하여 객체를 생성한다. 생성된 객체로 데이터베이스 이름을 명시 해주면 데이터베이스 객체가 생성된다. 위의 과정으로 데이터베이스 생성 또는 기존에 있다면 선택이 가능하다.
print(db_test)로 'Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test')' 와 같이 출력되면 연결이 된 것이다.
print(dir(db_test))
db_test는 객체이므로 dir()을 이용해 내장된 변수와 메소드를 확인할 수 있다.
먼저 사용될 Collection을 만들어 보자. (해당 이름의 Collection이 존재한다면 선택)
db_test_users = db_test.users
print(db_test_users)
print(dir(db_test_users))
만들어진객체를 print()를 이용해 구성을 살필 수 있다. 명령어는 snake_case 형식으로 되어있다. (기존 MongoDB Shell에서 쿼리를 할 때는 camelCase이므로 헷갈리지 말자.)
모든 메소드엔 비교 문법 역시 적용 가능핟.
데이터 입력 형식을 JSON형식으로 만들어줘야한다. 그리고 필드(속성)값은 "" 또는 ''으로 감싸주어 변수로 인식이 되지 않아야 입력이 가능하다.
user1 = {"name": "sangrae", "age": 29, "is_male": True, "tags": ["Back-End", "Front-End", "MonogoDB"]}
db_test_users.insert_one(user1)
_id에 고유 Primary Key가 지정이 되고 각 필드에 벨류대로 타입이 결정된다.
user2 = {"name": "minyoung", "age": 24, "is_male": False, "occupation": "Producer", "skills": ["Video-making"]}
user3 = {"name": "leo", "age": 27, "is_male": True, "company": {"name": "Julia", "addr": "LosAngeles, California USA"}}
user4 = {"name": "mia", "age": 23, "is_male": False, "occupation": "Student"}
db_test_users.insert_many([user2, user3, user4])
정해진 필드, 정해진 타입 등의 제한이 없는 MongoDB의 특성을 잘 볼 수 있다.
sangrae = db_test_users.find_one({"name": "sangrae"})
print(sangrae)
users = db_test_users.find({"age": {"$gte": 24}})
for user in users:
print(user)
users[0]와 같이 인덱스로 특정 값만 조회해 보거나 반복문을 이용하여 모두 조회해 볼 수 있다.
$set, $inc 등의 키워드를 사용해서 수정할 수 있다.
db_test_users.update_one({"name":"sangrae", "age": 29}, {"$set": {"age": 30}})
db_test_users.update_many({"age": {"$lt": 28}}, {"$set": {"occupation": None}})
없던 필드는 추가가 된다.
db_test_users.delete_one({"name": "sangrae"})
db_test_users.delete_many({"occupation": None})