FastAPI删除mongodb重复数据(数据清洗)

在 FastAPI 中删除 MongoDB 重复数据,你需要结合使用 MongoDB 查询和 FastAPI 的路由功能。以下是一个通用的例子,演示如何删除特定字段上的重复数据:

1. 定义数据模型:

python 复制代码
from pydantic import BaseModel, Field
from bson import ObjectId
from typing import Optional

class PyObjectId(ObjectId):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not ObjectId.is_valid(v):
            raise ValueError("Invalid objectid")
        return ObjectId(v)

    @classmethod
    def __modify_schema__(cls, field_schema):
        field_schema.update(type="string")

class ItemBase(BaseModel):
    field_to_check: str # 需要检查重复的字段

class Item(ItemBase):
    id: Optional[PyObjectId] = Field(alias="_id")

    class Config:
        arbitrary_types_allowed = True
        json_encoders = {ObjectId: str}

2. 创建 MongoDB 连接:

python 复制代码
from motor.motor_asyncio import AsyncIOMotorClient

MONGO_DETAILS = "mongodb://localhost:27017" # 替换为你的 MongoDB 连接字符串
client = AsyncIOMotorClient(MONGO_DETAILS)
database = client["your_database_name"] # 替换为你的数据库名称
collection = database.get_collection("your_collection_name") # 替换为你的集合名称

3. 实现删除逻辑:

python 复制代码
from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.delete("/items/duplicates/", response_model=list[Item])
async def delete_duplicate_items(field_name: str = "field_to_check"):
    """
    删除指定字段上的重复数据。

    Args:
        field_name (str, optional): 需要检查重复的字段名. Defaults to "field_to_check".

    Returns:
        list[Item]: 返回删除的重复文档列表.
    """
    # 使用聚合管道查找并删除重复项
    pipeline = [
        {"$match": {"version": 1}},  # 只处理 version 为 1 的文档
        {"$group": {"_id": {"{}".format(field_name): "$"+field_name}, "count": {"$sum": 1}, "dups": {"$push": "$_id"}}},
        {"$match": {"count": {"$gt": 1}}},
        {"$unwind": "$dups"},
        {"$skip": 1}, 
        {"$project": {"_id": "$dups"}}
    ]

    duplicate_ids = [doc["_id"] async for doc in collection.aggregate(pipeline)]
    if duplicate_ids:
        deleted_items = []
        for item_id in duplicate_ids:
            result = await collection.find_one_and_delete({"_id": item_id})
            if result:
                deleted_items.append(Item(**result))
        return deleted_items

    raise HTTPException(status_code=404, detail="没有找到重复数据")

4. 运行 FastAPI 应用:

bash 复制代码
uvicorn main:app --reload

解释:

  • 数据模型: 使用 Pydantic 定义数据模型,确保数据一致性.
  • MongoDB 连接: 使用 motor 库异步连接到 MongoDB 数据库.
  • 聚合管道: 使用 MongoDB 的聚合管道查找重复数据:
    • $group: 按指定字段分组,计算每个分组中文档数量.
    • $match: 筛选数量大于 1 的分组,即存在重复数据的组.
    • $unwind: 将 dups 数组展开为多行.
    • $skip: 跳过每组的第一个文档,因为我们只删除重复的.
    • $project: 只保留 _id 字段.
  • 删除数据: 使用 find_one_and_delete 方法删除找到的重复文档.
  • 错误处理: 如果没有找到重复数据,抛出 404 错误.

注意:

  • 将代码中的占位符替换为你自己的数据库和集合名称.
  • 可以根据需要修改聚合管道,以适应不同的重复数据查找需求.
相关推荐
威联通网络存储4 小时前
TS-h2490FU在面板制造Array段AOI缺陷画廊中的并联
python·制造
接针5 小时前
UV 常用命令
python·uv
无垠的广袤6 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
Yolanda_20227 小时前
在vscode终端中可使用pip,但是cmd终端中找不到命令 pip问题的解决
vscode·python·conda·pip
2301_764441337 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
dogstarhuang8 小时前
用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)
爬虫·python·ai编程
猫头虎8 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
吴声子夜歌8 小时前
MongoDB 4.2——查询
数据库·mongodb
心运软件9 小时前
Python实战:中国大学排行榜数据采集与可视化大屏
后端·python
长不胖的路人甲9 小时前
什么是赫夫曼树(哈夫曼树 / Huffman Tree)
python·算法·霍夫曼树