2023. 7. 15. 22:30

참고 url: python - "ObjectId' object is not iterable" error, while fetching data from MongoDB Atlas - Stack Overflowd

 

"ObjectId' object is not iterable" error, while fetching data from MongoDB Atlas

Okay, so pardon me if I don't make much sense. I face this 'ObjectId' object is not iterable whenever I run the collections.find() functions. Going through the answers here, I'm not sure where to s...

stackoverflow.com

의 맨밑의 글 참조

 

from fastapi import FastAPI, Body, HTTPException, status

from typing import Dict, List

from decouple import config
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from motor.motor_asyncio import AsyncIOMotorClient

from bson import ObjectId



DB_URL = config('DB_URL', cast=str)
DB_NAME = config('DB_NAME', cast=str)

app = FastAPI()

@app.on_event("startup")
async def startup_db_client():
    app.mongodb_client = AsyncIOMotorClient(DB_URL)
    app.mongodb = app.mongodb_client[DB_NAME]

@app.on_event("shutdown")
async def shutdown_db_client():
    app.mongodb_client.close()


@app.get("/car/{id}")
async def root(id:str):
    # if (car := await app.mongodb["cars"].find_one({"_id": ObjectId(id)})) is not None:
    #     return car
    # raise HTTPException(status_code=404, detail=f"Car with {id} not found")
    car = await app.mongodb["cars"].find_one({"_id": ObjectId(id)})
    # print(car)
    return get_ids(car)

@app.get("/cars/price")
async def cars_by_price(min_price:int=0, max_price:int=100000):
    list = app.mongodb["cars"].find({
        "$and": [{"price":{"$gte": min_price}},{"price":{"$lte": max_price}}]  
    })
    result = [get_ids(car) async for car in list]
    return result

def get_ids(car: Dict) -> Dict:
    # print(car)
    id = car["_id"]
    car["_id"] = str(id)
    return car


@app.post("/cars")
async def new_car(car: Dict = Body(...)):
    # print(car)
    car = jsonable_encoder(car)
    new_car = await app.mongodb["cars"].insert_one(car)
    # print(new_car)
    # print(new_car.inserted_id)
    created_car = await app.mongodb["cars"].find_one({"_id": ObjectId(new_car.inserted_id)})
    #return {"message": "new_car created"}
    return JSONResponse(status_code=status.HTTP_201_CREATED, content=get_ids(created_car))
Posted by 다만사