본문 바로가기
MongoDB/MongoDB Atlas CRUD 다루기

MongoDB Atlas 클러스터(데이터베이스) access하기&CRUD하기 - 2. insert_many()

by Fletcher 2024. 7. 28.

※ 참고자료 ※

PyMongo 4.8.0 Documentation Reference Link

https://pymongo.readthedocs.io/en/stable/index.html

 

 

 

반갑습니다!

저번 포스트에 MongoDB에 간략하게 살펴보고 insert_one() 함수를 사용했었습니다

저는 Flask를 이용하므로 Python에 해당하는 코드로 진행되겠습니다!

다른 언어에 대한 코드는 공식 문서 및 클러스터 생성시 안내해주니 참고 부탁드립니다~^^!

 

기본적인 부분은 이전 포스트에서 기술해놨으니 이번 포스트부터는 생략하고,

해당하는 내용만 기술하겠습니다 ^^

 

 

 

저번 시간에는 insert_one() 함수를 이용해서 임의의 컬렉션에 단일 도큐먼트를 삽입했었는데요

이번엔 여러 도큐먼트를 한 번에 삽입하도록 하겠습니다 ^^

 

 

#MongoDB Create - insert_many() 테스트
class MongoDBInsertManyTestResource(Resource):
    def post(self):
        # 클러스터 접근을 위한 클라이언트 객체 생성
        client = pymongo.MongoClient(Config.MONGO_DB_URI)

        # 컬렉션 정보 저장
        database = client["project-server"]
        collection = database["MongoDB_TEST"]

        #샘플 데이터
        test_documents = [
            {
                "name":"Jeremy Renner",
                "gender":"male",
                "age":"39",
                "job":"Police Officer",
                "favorite":"fishing"
            },
            {
                "name":"Brandon Led",
                "gender":"male",
                "age":"22",
                "job":"Student",
                "favorite":"Programming"
            },
            {
                "name":"Jenny Lesh",
                "gender":"femail",
                "age":"41",
                "job":"Lawyer",
                "favorite":"Camping, Weight-Training, Soccer"
            },
            {
                "name":"Brandon Led",
                "gender":"female",
                "age":"27",
                "job":"Marine Corps Officer",
                "favorite":"Marathon, Running, Reading"
            }
        ]

        # 다중 항목 삽입
        collection.insert_many(test_documents)

        # 리소스 종료
        client.close()

        return {"result":"success"}, 200

 

insert_one()과 구조는 같습니다

먼저 Client 객체를 생성하고, 내 계정의 어떤 Database의 어떤 Collection인지를 지정해주시면 됩니다

만약 해당하는 DB와 Collection이 없으면 자동으로 생성해서 그 안에 데이터를 삽입합니다 ^^

이번에 준비한 데이터는 여러 딕셔너리를 요소로 갖는 리스트 타입입니다

테스트용 api 리소스를 연결했으니 포스트맨으로 한 번 호출해보겠습니다

 

 

 

 

Methods는 POST로 설정을 했었고, 별도의 JSON Body는 지정하지 않았었습니다

API를 호출하니 성공적으로 처리되어 success 메세지가 리턴되었습니다 ^^

그럼 데이터베이스에 정상적으로 들어갔는지 한 번 확인해볼까요?

 

 

 

 

기존에 serverless_move_server_db 데이터베이스 하나 밖에 없었는데요

코드에서 "project-server" 데이터베이스의 "MongoDB_TEST" 컬렉션으로 저장 경로를 지정했더니

자동으로 해당 데이터베이스와 컬렉션이 생성되어 데이터들이 삽입 되었습니다 ^^

보시는 바와 같이 Query Results에 코드 상의 데이터대로

도큐먼트들이 잘 생성된 것을 확인할 수 있겠습니다!

 

그럼 여기서 궁금한 부분,

정말로 insert_one() 함수로는 여러 도큐먼트를 생성할 수 없을까요?

한 번 실험을 해보겠습니다!

 

 

#MongoDB Create - insert_many() 테스트
class MongoDBInsertManyTestResource(Resource):
    def post(self):
        # 클러스터 접근을 위한 클라이언트 객체 생성
        client = pymongo.MongoClient(Config.MONGO_DB_URI)

        # 컬렉션 정보 저장
        database = client["project-server"]
        collection = database["MongoDB_TEST"]

        #샘플 데이터
        test_documents = [
            {
                "name":"Jeremy Renner",
                "gender":"male",
                "age":"39",
                "job":"Police Officer",
                "favorite":"fishing"
            },
            {
                "name":"Brandon Led",
                "gender":"male",
                "age":"22",
                "job":"Student",
                "favorite":"Programming"
            },
            {
                "name":"Jenny Lesh",
                "gender":"femail",
                "age":"41",
                "job":"Lawyer",
                "favorite":"Camping, Weight-Training, Soccer"
            },
            {
                "name":"Brandon Led",
                "gender":"female",
                "age":"27",
                "job":"Marine Corps Officer",
                "favorite":"Marathon, Running, Reading"
            }
        ]

        # 다중 항목 삽입
        collection.insert_one(test_documents)

        # 리소스 종료
        client.close()

        return {"result":"success"}, 200

 

아까와 동일한 코드에서 insert_many()가 아니라 insert_one() 함수를 사용하도록 하겠습니다

 

 

 

 

코드만 살짝 바꾼 다음 다시 해당 API를 호출해보니

Internal Server Error 메세지가 출력되는 것을 확인할 수 있겠습니다

그럼 정확히 뭐가 문제인지 로그를 또 한 번 봐야겠죠?

 

 

 

 

TypeError를 토해내며 장렬히 사망하였는데요

에러 메시지에 따르면 insert_one() 메서드에 전달된

test_documents 객체가 올바른 타입이 아니기 때문이라고 합니다!

 

insert_one() 메서드는 단일 문서를 삽입할 때 사용하는데,

해당 문서는 반드시 dict, bson.son.SON, bson.raw_bson.RawBSONDocument,

또는 collections.MutableMapping을 상속받는 타입이어야 한다고 하네요

 

 

 

 

코드 자체에 문제가 있어 에러가 발생했으므로,

데이터베이스에는 해당 작업에 대한 결과물이 반영되지 않았습니다

아까 insert_many() 함수를 사용하여 정상적으로 생성된 도큐먼트만 있는 것을 확인할 수 있겠습니다 ^^

 

가장 기본적은 CRUD 중 Create의 insert_one()과 insert_many()를 살펴보았습니다

다음 포스트에는 해당 콜렉션에 생성된

데이터들을 조회하는 것에 대해서 알아보도록 하겠습니다

 

읽어주셔서 감사드리며, 개발의 세계에서 항상 건승하시기 바랍니다 ^.^