首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FASTAPI上使用PyMongo将元素插入到嵌套模型Mongodb数组中

在FASTAPI上使用PyMongo将元素插入到嵌套模型Mongodb数组中
EN

Stack Overflow用户
提问于 2022-06-01 05:11:17
回答 1查看 321关注 0票数 0

最近,我继续将元素插入到由父文档持有的数组中。基本上,我的模型代表了一列可以有很多货车的火车。马车是一个载着马车的数组。

这是我的数据库模型

代码语言:javascript
复制
rom typing import Optional,Union

from pydantic import BaseModel, EmailStr, Field

#Wagon Model
class Wagon(BaseModel):
    no: int = Field(...)
    wagon_code: str = Field(...)
    wagon_type: str = Field(...)
    passengers_on_board: int = Field(...)
    max_capacity: int = Field(...)
    weight: float = Field(...)
    dimension: tuple  = Field(...)

    class Config:
        schema_extra = {
            "example": {
                "no": 3,
                "wagon_code": "GA151-03",
                "wagon_type": "Penumpang",
                "passengers_on_board": 40,
                "max_capacity":80,
                "weight":1050.01,
                "dimension": (20.62,9.91,4.15)
            }
        }

class UpdateWagon(BaseModel):
    no: Optional[int] 
    wagon_code: Optional[str]
    wagon_type: Optional[str]
    passengers_on_board: Optional[int]
    max_capacity: Optional[int]
    weight: Optional[float]
    dimension: Optional[tuple]
    
    class Config:
        schema_extra = {
            "example": {
                "no": 3,
                "wagon_code": "GA151-03",
                "wagon_type": "Penumpang",
                "passengers_on_board": 64,
                "max_capacity":80,
                "weight":1050.01,
                "dimension": (20.62,9.91,4.15)
            }
        }


#Train Model
class Train(BaseModel):
    name: str = Field(...)
    no: str = Field(...)
    first_station: str = Field(...)
    last_station: str = Field(...)
    from_: str = Field(...)
    to_: str = Field(...)
    current_station: str = Field(...)
    position: Optional[tuple]
    wagons: Union[list[Wagon], None] = None

    class Config:
        schema_extra = {
            "example": {
                "name": "Gajayana",
                "no": "GA-151",
                "first_station": "Malang - Kota Baru",
                "last_station": "Jakarta - Gambir",
                "from_":"Malang - Kota Baru",
                "to_":"Malang - Kota Lama",
                "current_station":"Malang - Kota Baru",
                "position": (2.12,2.12),
                "wagons" : [],
                }
        }

class UpdateTrain(BaseModel):
    name: Optional[str]
    no: Optional[str]
    first_station: Optional[str]
    last_station: Optional[str]
    from_: Optional[str]
    to_: Optional[str]
    current_station: Optional[str]
    position: Optional[tuple]
    wagons: Optional[list]

    class Config:
        schema_extra = {
            "example": {
                "name": "Gajayana",
                "no": "GA-151",
                "first_station": "Malang - Kota Baru",
                "last_station": "Jakarta - Gambir",
                "from_":"Malang - Kota Lama",
                "to_":"Kepanjen",
                "current_station":"Malang - Kota Baru",
                "position": (2.08,2.16),
                "wagons": [],
            }
        }

我用arrayFilters把新造的马车附加到火车上。然而,我没有运气附加模型,但一个新的旅行车创建了如下所示的功能。

代码语言:javascript
复制
async def add_wagon(train_no: str,wagon_data: dict) -> dict:
    wagon = await wagon_collection.insert_one(wagon_data)
    new_wagon = await wagon_collection.find_one({"_id": wagon.inserted_id})
    train = await train_collection.find_one({"no": train_no})
    if train:
        train_collection.update_one({"no": train_no},{"$set":{"wagons.$[element]":new_wagon}},array_filters=[{"element":{"$exists":"false"}}],upsert=True)
    return wagon_helper(new_wagon)

该模型被用作FASTAPI的API。上面的操作是使用PUT方法完成的,路由如下所示。

代码语言:javascript
复制
@router.put("{train_no}/wagons/", response_description="Wagon data added into the database")
async def add_wagon_data(train_no: str,wagon: Wagon = Body(...)):
    wagon = jsonable_encoder(wagon)
    new_wagon = await add_wagon(train_no,wagon)
    return ResponseModel(new_wagon, "Wagon added successfully")

我的arrayFilters是错的吗?还是我使用$exists作为完全相等匹配的方式是不正确的?

EN

回答 1

Stack Overflow用户

发布于 2022-06-01 05:31:10

原来我想得太复杂了。USing $pushupsert=True一起解决了这个问题。

代码语言:javascript
复制
async def add_wagon(train_no: str,wagon_data: dict) -> dict:
    wagon = await wagon_collection.insert_one(wagon_data)
    new_wagon = await wagon_collection.find_one({"_id": wagon.inserted_id})
    train = await train_collection.find_one({"no": train_no})
    if train:
        train_collection.update_one({"no": train_no},{"$push":{"wagons":new_wagon}},upsert=True)
    return wagon_helper(new_wagon)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72456687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档