본문 바로가기

개발/Flask, Fastapi

flask-mongoengine으로 추가한 데이터가 Mongodb에서 보이지 않을 때

내가 해결한 방법 : api로 받아온 json 파일의 스펠링을 1)스키마와 

2)몽고디비에 추가하는 함수에 들어갈 변수와 일치시켜야 한다.

 

몽고디비를 사용한 이유가 json 파일 자체를 간편하게 추가할 수 있다는 장점 때문이었는데, 

ORM 방식으로 몽고디비를 사용하기 위해서는 결국 노가다로 변수를 넣어주어야 했다...

내가 사용한 데이터는 restAPI 사이트에서 키를 발급받아 받아온 IMDb 데이터로, 

json 파일에 key가 대문자로 들어있었다.

# 주의 : 무조건 소문자가 아니라 json 파일과 일치하도록 key값의 대소문자를 넣어야 합니다.

class Movie(db.Document):
    title = db.StringField()
    year = db.IntField()
    rated = db.StringField() # 관람등급
    released = db.StringField() 
    runtime = db.IntField() 
    genre = db.StringField()
    genre1 = db.StringField()
    director = db.StringField()
    writer = db.StringField()
    actors = db.StringField()
    plot = db.StringField()
    language = db.StringField()

 

보통 스키마는 소문자로 작성하길래 

소문자로 작성했더니 Postman에서 제대로 데이터가 추가되지 않았다. 

class Movie(db.Document):
    imdbID = db.StringField() # primary key?
    Title = db.StringField()
    Year = db.IntField()
    Rated = db.StringField() # 관람등급
    Released = db.StringField()
    Runtime = db.StringField() 
    Genre = db.StringField()
    Genre1 = db.StringField()
    Director = db.StringField()
    Writer = db.StringField()
    Actors = db.StringField()
    Plot = db.StringField()
    Language = db.StringField()
    Country = db.StringField()
    Awards = db.StringField()
    Poster = db.StringField()
    Ratings = db.ListField(db.DictField()) #db.EmbeddedDocumentListField(Ratings)
    Metascore = db.StringField()
    RottenTomatoes = db.StringField()
    imdbRating = db.FloatField()
    imdbVotes = db.StringField()
    BoxOffice = db.StringField()
    Production = db.StringField()
    keywords = db.ListField()
    meta = {'strict': False} #ignoring this error when having extra fields while data loading

그래서 대문자로 바꿨더니 잘 동작하는 거 같았지만... NotUniqueError가 일어나고 데이터베이스에 Document(개별 영화의 json 파일) 하나밖에 안 남길래 다시 다 소문자로 바꿨다. (삽질의 시작 - 따라하지 마시오)

그리고 내가 따로 기준을 두어 필터링한 영화 데이터가 900개 가량 되어 json 파일로 몽고디비에 한 번에 추가했는데,

몽고디비에 있는 json 파일(key가 대문자로 시작) <-> Flask-mongoengine으로 추가한 파일(스키마 때문에 key가 다 소문자가 됨) 이 같게 인식되지 않아, 

- 몽고디비에서 제대로 조회가 되지 않고

- 몽고디비에서 json으로 한 번에 추가한 데이터는 flask-mongoengine 쿼리로 제대로 조회되지 않았다.

(title : "델마와 루이스") 을 해봤자 실제 데이터에는 (Title : "델마와 루이스") 로 들어가 있었기 때문.

스키마를 싹 갈아엎으니 postman, 몽고디비 둘 다 조회가 잘 되고 추가도 잘 된다!!