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}})

'개인공부' 카테고리의 다른 글
| 함수형 프로그래밍, 자바스크립트 메소드 (1) | 2024.04.14 |
|---|---|
| npm start, npm run serve, npm ren dev의 차이점 (0) | 2024.04.07 |
| fastapi docs에서 login, logout 테스트 잘 안됨 (0) | 2023.07.25 |
| 도커 컴포즈에서는 이미 돌아간 컨테이너 삭제 어려운가 보다. (0) | 2023.07.21 |
| NoSQL (1) | 2023.07.13 |