Blue Chicken - The Legend Of Zelda
본문 바로가기

개인공부

.py에서 mongodb 타입 변경

mongodb에는 auto-increment라는 기능이 내장되어 있지 않기 때문에 기능을 직접 구현해야 한다.이를 위해 별도의 컬렉션을 사용하여 probe에 대한 다음 id 값을 추적할 수 있습니다.

auto-increment 보다가 뭔가 이상해서 확인해보니 id를 mongodb의 objectid로 써도 될 것 같았다. 그래서 코드를 바꾸기로 함

그런데 원래 id를 int로 쓰고 있었는데 objectid(이하 _id)를 쓰려니까 str 타입으로 바꿔줘야 했다. 그 과정에서 오류가 났고 아래 코드를 추가하여 실행 시켜서 컬렉션의 id 타입을 int에서 str로 변경해줬다.

collection = db["user"]

# 각 문서를 순회하면서 id 필드의 타입을 바꿈
for doc in collection.find():
    collection.update_one({"_id": doc["_id"]}, {"$set": {"id": str(doc["id"])}})

아래 코드도

new_user = db.user.insert_one(userinfo) 에서
result = db.user.insert_one(userinfo)
userinfo["id"] = str(result.inserted_id) 로 변경해서 object_id를 받아줬다.
#접근 계정 신규생성
@app.post("/user", response_model=User)
def create_user(user:User):
    #존재여부 확인
    existing_user = db.user.find_one({"username":user.username})
    if existing_user:
        raise HTTPException(status_code=status.HTTP_409_CONFLICT,detail="Username already exists")
    
    #비밀번호 암호화
    hashed_password = bcrypt.hashpw(user.password.encode('utf-8'), bcrypt.gensalt())
    
    #신규 정보
    userinfo = user.dict()
    userinfo['password'] = hashed_password.decode("utf-8")
    
    #신규생성
    #아래 한줄은 id를 직접 입력하는 코드
    #new_user = db.user.insert_one(userinfo)
    
    #이 두 줄은 mongodb의 object_id를 받아옵니다. objectId를 str로 변환하고 id 필드에 할당
    result = db.user.insert_one(userinfo)
    userinfo["id"] = str(result.inserted_id)
        
    #MongoDB에서 반환된 데이터를 사용하여 사용자 객체 생성
    #User 객체에서 생성된 딕셔너리의 키 밸류 값을 키워드 인수로 전달
    created_user = User(**userinfo)
    
    return created_user

실행전
실행후

int로 id를 쓰는 모든 코드를 변경하다가 실패해서 다시;;

 

# 각 문서를 순회하면서 id 필드의 타입을 바꿈
for doc in collection.find():
    # 문자열을 정수로 변환
    new_id = int(doc["id"])
    collection.update_one({"_id": doc["_id"]}, {"$set": {"id": new_id}})

실행후