Python检查MongoDB索引列中的字段是否存在

python 复制代码
import pymongo
import pandas as pd

# 这些字段在 MongoDB 中必然存在(或默认存在),无需检查
ALWAYS_EXIST_FIELDS = {"_id"}

def check_index_fields(collection):
    """
    检查指定集合中索引字段是否在文档中存在。
    返回不存在的字段名列表。
    """
    indexes = collection.index_information()
    index_fields = set()
    for info in indexes.values():
        for field, _ in info['key']:
            index_fields.add(field)

    # 去除必然存在的字段,只检查可能缺失的字段
    to_check = index_fields - ALWAYS_EXIST_FIELDS
    print(f"  [LOG] 待检查索引字段(已去除必然存在字段): {sorted(to_check) if to_check else '无'}")

    missing_fields = []
    for field in sorted(to_check):
        exists = collection.find_one({field: {"$exists": True}}) is not None
        print(f"  [LOG] 检查字段 '{field}': {'存在' if exists else '缺失'}")
        if not exists:
            missing_fields.append(field)
    return missing_fields

if __name__ == "__main__":
    # 连接 MongoDB(请根据实际情况修改连接串)
    client = pymongo.MongoClient("mongodb://user:password!@127.0.0.1:27017/ota?authSource=ota&directConnection=true")
    db = client["ota"]

    collection_names = db.list_collection_names()
    print(f"[LOG] 当前数据库包含 {len(collection_names)} 个集合,开始遍历...")

    results = []
    for idx, coll_name in enumerate(collection_names, start=1):
        print(f"[LOG] ({idx}/{len(collection_names)}) 正在检查集合: {coll_name}")
        coll = db[coll_name]
        missing = check_index_fields(coll)
        if missing:  # 只保留存在缺失字段的集合
            results.append({
                "collection": coll_name,
                "missing_fields": ", ".join(missing)
            })
            print(f"  [LOG] 集合 {coll_name} 存在缺失字段,已记录")
        else:
            print(f"  [LOG] 集合 {coll_name} 没有缺失字段,不保存到 Excel")

    if results:
        df = pd.DataFrame(results)
        df.to_excel("D:/index_missing_fields.xlsx", index=False)
        print(f"[LOG] 检查完成,共 {len(results)} 个集合存在缺失字段,结果已保存到 index_missing_fields.xlsx")
    else:
        print("[LOG] 所有集合均无缺失字段,无需生成 Excel 文件")
相关推荐
VidDown3 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook7 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺7 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川8 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦8 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python
小羊没烦恼!8 小时前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
钱栈up9 小时前
扫完 3.5 万文件后,我发现了 521 组散落的同名文件
爬虫·python·数据分析