[MongoDB/pymongo] PyMongo 데이터 삽입 (insert) 하는 두 가지 방법

2022. 6. 14. 20:0003. Resources/Database

728x90
반응형

이전 포스팅에서 MongoDB를 설치하고, pymongo를 어떻게 불러와서 사용하는지까지 확인해봤다.

그럼 이제 데이터베이스에 우리가 원하는 데이터를 어떻게 넣는지 알아보자.

 

먼저, 이전 포스팅에서 썼던 collection을 가져오는 부분을 다시 살펴보면 아래와 같다.

from pymongo import MongoClient

db_client = MongoClient()
database = db_client."database_name"
collection = database."collection-name"

이 코드 뒤로 우리가 원하는 데이터를 삽입하면 되는 방식이다.

 

나의 경우를 예로 들면 아래와 같은 딕셔너리형 데이터를 넣으려고 한다.

    map_to_database = {
        "type": "map",
        "name": map_name
    }

별 다를 건 없고

    collection.insert_one(map_to_database)

위처럼 collection에서 insert_one 을 이용해서 삽입할 수 있다.

여러 데이터를 한 번에 넣고 싶으면 insert라는 커맨드를 쓰면 된다.

 

그런데 insert_one의 문제점이 하나 있다.

바로 중첩 판단을 할 수가 없다는 것이다. 따라서, 같은 데이터를 계속 집어넣으면 계속 저장된다.

mongodb에서는 데이터베이스에 데이터를 저장할 때  "_id"라는 속성을 하나 만들어 주는데,

새로 삽입하면 "_id" 값이 다른 새로운 데이터가 생성되는 방식이라서 그렇다.

 

이를 해결할 수 있는 방법은 아래 코드처럼 update_one을 이용하는 방법이다.

    collection.update_one({"name": map_to_database["name"]},
                          {"$set": {**map_to_database}}, upsert=True)

특히 여기서 중요한 옵션은 upsert=True 이다.

update_one 함수는 원래는 해당 데이터를 찾아서 (find) 값을 변경해주는 함수이다.

그런데 upsert 옵션을 True로 설정하면, 해당 데이터가 collection에 없는 경우, 값을 새로 만들어주게된다.

 

그래서 기존에 find_one으로 존재 여부를 확인하고 insert_one을 이용하여 값을 넣는 방식을 위의 방식으로 모두 변경했다.

아마 기존 sql이라면 unique 옵션을 활성화해서 데이터 유일성을 보장했을텐데, mongodb에서는 위의 방식으로 해야만 했다!

반응형