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 文件")
相关推荐
努力的小Qin1 小时前
梯度下降如何实现参数优化:从线性回归到 Sigmoid 分类
人工智能·python·神经网络
zander2581 小时前
LeetCode 739:每日温度——为什么单调栈要持续弹出
开发语言·python·算法
for_ever_love__2 小时前
python基础语法学习: 文件操作
python·学习
青春不败 177-3266-05202 小时前
基于R、Python的Copula变量相关性分析及AI大模型应用
人工智能·python·r语言·贝叶斯·统计学·copula
汤姆yu3 小时前
基于python大数据的高校舆情监测系统的设计与实现
大数据·开发语言·python·分享·分析·舆情
Cory.眼3 小时前
Python爬虫实战:从入门到进阶
开发语言·爬虫·python
qq_422152573 小时前
Token到底是什么?Tokenizer分词机制与中文token开销入门科普
人工智能·python·深度学习
buyue__3 小时前
Python实现连接MySQL数据库并执行目录下的所有SQL文件,遇到错误时终止执行。
python·mysql
SuperByteMaster4 小时前
autosar 架构脚本提示语
python