Mongodb schema 설정(pymongo)

highway92·2021년 12월 4일
0

project-bornfire

목록 보기
1/2

1. project-bornfire

현재 교육중인 과정의 일환으로 팀프로젝트를 진행하게 되었다. 프로젝트의 목표는 코로나 블루로 힘든 사람들을 위한 익명 감정공유 게시판을 만드는 것이었다.
두서 없지만 맡은 부분에서 사용한 기술들과 경험들을 정리하고자 한다.

2. Mongodb

SQL을 사용하지 않고 Mongo를 사용한데는 여러가지 이유가 있겠지만 교육과정 중 배운 내용을 활용하고 싶다는 점이 컷다. 필자는 과거 mongoose를 사용하여 mongodb를 다뤄본적이 있으나 pymongo를 사용한 것은 처음이었다.

schema 설정과 관련된 내용 역시 여러번의 위기를 겪으며 해낸 만큼 정리를 하고자 한다.

다음은 bornfire의 DB다이어그램이다.

3개의 collection 중 user_collection을 예시로 schema 설정을 다뤄 보도록 한다.

2-1. create_collection

db연결은

connection = pymongo.MongoClient("로컬환경이라면 localhost:27017 이였을 것이다.")
db = connection.get_database("데이터베이스 명")

이런식으로 해줄 수 있다.

가장 처음해야 할 일은 컬렉션을 만드는 것이다.

import pymongo
db.create_collection("User_collection")

이런 식으로 원하는 컬렉션 명을 입력함으로써 컬렉션을 생성할 수 있다.(당연히 db와 연결이 되어있어야 한다.)

collection을 생성함과 동시에 schema를 적용할 수 도 있지만, 필자는 다른 방식을 사용하였다.

2-2. 스키마 설정

이런 식 으로 jsonschema를 활용하여 여러가지 옵션들을 추가 할 수있다.
자세한 내용은 공식 페이지를 참고하자 : https://docs.mongodb.com/manual/core/schema-validation/
영어가 이해하기 힘들다면 다음의 페이지를 참고하는 것도 좋다:
https://madplay.github.io/post/json-schema-validation-examples

vexpr = {
        "$jsonSchema" : {
            "title" : "User_schema",
            "description" : "User schema contains email, password, emotion",
            "bsonType" : "object",
            "required" : ["User_email", "User_pw"],
            "properties" : {
                "User_email" : {
                    "bsonType" : "string",
                    "pattern" : "^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
                },
                "User_pw" : {
                    "bsonType" : "string",
                },
                "User_feed_log" : {
                    "bsonType" : "array",
                    "items" : { # {Created_at:Predicted_value}
                        "type" : "object"
                    }
                },
                "Verify_question": {
                    "bsonType" : "object" #{"question:answer"}의 형태로 집어넣을 예정
                }
            }
        }
    }

2-3. 스키마 적용하기

필자가 사용한 방법은 이미 만들어진 collection에 스키마를 적용하는 방법이다.
collMod는 컬렉션의 이름
validator에는 넣고자하는 스키마
validationLevel에는 스키마에서 벗어난 데이터가 들어올때 어느 정도 수준의 block을 할지를 설정한다.

 db.command({
        'collMod' : "User_collection",
        'validator' : vexpr,
        'validationLevel' : "moderate"
    })

2-4. 인덱스 설정

필자가 구성한 collection에서 user_email은 중복된 값을 가져서는 안된다. 이를 위해 user_email을 인덱스로 설정해주었다.

    db.User_collection.create_index([('User_email', 1)], name='User_email', unique=True)

이런식으로 index를 만들고 unique 값을 부여함으로써 중복을 방지 할 수 있다. 인덱스에 대한 부분은 필자 또한 더 많은 공부가 필요하다.

profile
웹 개발자로 활동하고 있습니다.

0개의 댓글