MongoDB 安装与配置

MongoDB(Windows 系统)下载 - 安装 - 配置完整步骤小结

一、前期准备

  1. 环境要求
    系统:Windows 10/11(64 位)
    权限:需管理员权限(修改目录权限、注册系统服务)
    路径要求:安装目录禁止含中文 / 空格 / 特殊字符(推荐 D:\MongoDB)
  2. 下载安装包

官方下载地址:https://www.mongodb.com/try/download/community

选择版本:Windows x64 → 下载 msi 安装包(新手推荐);或便携版 zip 包(免安装)

二、安装 / 部署步骤(分 2 种方式)

方式 1:MSI 安装包(推荐新手)

步骤 1:运行安装包,选择自定义安装

双击 msi 包,点击「Next」→ 勾选「I accept...」→ 点击「Custom」(自定义);

修改安装路径为 D:\MongoDB → 点击「Next」;

「Service Configuration」环节:

勾选「Install MongoDB as a Service」(注册为系统服务);

「Service Name」保持 MongoDB;

「Data Directory」改为 D:\MongoDB\data\db;

「Log Directory」改为 D:\MongoDB\log;

取消勾选「Install MongoDB Compass」(可视化工具可单独装)→ 点击「Install」完成安装。

步骤 2:验证安装

安装完成后,Win+R 输入 services.msc → 查看「MongoDB Server」是否存在(状态默认「已停止」)。

方式 2:便携版(免安装,灵活)

步骤 1:解压并创建目录

下载 zip 包后,解压到 D:\MongoDB;

手动创建核心目录(管理员 CMD 运行):

bash

运行

md D:\MongoDB\data\db # 数据存储目录

md D:\MongoDB\log # 日志目录

md D:\MongoDB\conf # 配置文件目录(可选)

步骤 2:创建配置文件(可选)

在 D:\MongoDB\conf 新建 mongod.cfg,内容如下:

bash 复制代码
yaml
systemLog:
  destination: file
  path: D:\MongoDB\log\mongod.log
  logAppend: true
storage:
  dbPath: D:\MongoDB\data\db
  engine: wiredTiger
net:
  port: 27017
  bindIp: 127.0.0.1
processManagement:
  windowsService:
    serviceName: MongoDB
    displayName: MongoDB Server

三、权限配置(核心!解决日志 / 数据写入失败)

步骤 1:修改目录所有者

右键 D:\MongoDB → 「属性」→「安全」→「高级」;

点击「所有者」→「更改」→「高级」→「立即查找」→ 选中当前用户名 → 「确定」;

勾选「替换子容器和对象的所有者」→「应用」→「确定」。

步骤 2:添加完全控制权限

回到「安全」标签 →「编辑」→ 选中当前用户名;

勾选「完全控制」→「确定」(确保子目录 / 文件继承权限)。

四、注册并启动 MongoDB 服务

步骤 1:管理员身份打开 CMD

方式:Win+R 输入 cmd → 按住 Ctrl+Shift+回车;

进入 MongoDB 的 bin 目录:cd D:\MongoDB\bin。

步骤 2:注册 + 启动服务(分 2 种场景)

场景 1:便携版 / 手动注册

bash

运行

完整步骤:修改 D:\MongoDB 目录的权限(管理员级

1 秒打开【管理员命令行】

按键盘:Win + R

输入:cmd
不要直接回车!

按住 Ctrl + Shift + 回车

→ 自动以管理员身份打开命令行

方法 2:开始菜单右键(最直观)

点击左下角 开始菜单

找到 Windows 系统 → 命令提示符

右键 → 更多 → 以管理员身份运行

方法 3:搜索(最快)

左下角搜索框输入:cmd

右边直接点:以管理员身份运行)

步骤 1:打开目录属性的「高级安全设置」

打开电脑「此电脑」→ 进入 D 盘 → 右键点击 MongoDB 文件夹 → 选择「属性」;

切换到「安全」标签 → 点击右下角「高级」按钮(进入高级安全设置)。

步骤 2:修改目录「所有者」(核心!)

在高级安全设置窗口,点击顶部「所有者」旁边的「更改」;

弹出的「选择用户或组」窗口中:

点击「高级」→ 再点击「立即查找」;

在下方「搜索结果」里找到你的当前用户名(比如 Administrator、User 或你的电脑名);

选中你的用户名 → 点击「确定」→ 再点击「确定」;

回到高级安全设置窗口,勾选「替换子容器和对象的所有者」→ 点击「应用」→ 弹出确认框选「是」;

✅ 这一步会把 MongoDB 文件夹及其所有子文件夹 / 文件的所有者,改成你的用户(解决权限根源)。

步骤 3:添加「完全控制」权限

还是在高级安全设置窗口,点击「添加」;

点击「主体」旁边的「选择主体」→ 重复步骤 2 的「高级→立即查找」→ 选中你的用户名 → 「确定」;

在「权限」部分,勾选:

「完全控制」(最上方)

「修改」

「读取和执行」

「列出文件夹目录」

「读取」

「写入」

点击「确定」→ 回到高级安全设置窗口,再点击「确定」→ 最后点击属性窗口的「确定」。

步骤 4:手动创建日志文件(避免自动创建失败)

进入 D:\MongoDB\log 目录;

右键 → 新建 → 文本文档 → 重命名为 mongod.log(删除 .txt 后缀,确保后缀是 .log);

右键这个 mongod.log 文件 → 属性 → 安全 → 确保你的用户有「完全控制」权限。

步骤 5:重新注册并启动 MongoDB 服务

以管理员身份打开 CMD,进入 D:\MongoDB\bin,运行以下命令(分两行!):

bash

运行

第一步:卸载残留的服务(先清干净)

mongod --remove --serviceName "MongoDB"

第二步:重新注册服务

mongod --dbpath "D:\MongoDB\data\db" --logpath "D:\MongoDB\log\mongod.log" --logappend --install --serviceName "MongoDB"

第三步:启动服务

net start MongoDB

✅ 成功的标志

注册服务时无报错,输出类似 Service MongoDB installed;

启动服务时输出 MongoDB 服务已经启动成功。;

Win+R 输入 services.msc → 找到「MongoDB」,状态是「正在运行」;

关闭手动启动的 MongoDB 窗口,运行 Python 代码仍能连接成功。

为什么之前一直报错?

Windows 的「文件所有者」和「权限」是分开的:即使你是管理员,若文件夹所有者是「SYSTEM」或「TrustedInstaller」,你也没有写入权限 ------ 修改所有者后,才能真正拿到目录的控制权。

兜底方案(若仍失败)

如果改权限还是不行,直接用「系统账户」运行服务:

bash

运行

注册服务时指定用 LocalSystem 账户(最高权限)

mongod --dbpath "D:\MongoDB\data\db" --logpath "D:\MongoDB\log\mongod.log" --logappend --install --serviceName "MongoDB" --serviceUser "LocalSystem"

net start MongoDB

按这个步骤改完,就能彻底解决日志文件无法写入的问题,MongoDB 会作为系统服务永久运行,不用每次手动启动了!

1. 卸载残留服务(如有)

mongod --remove --serviceName "MongoDB"

2. 注册服务(指定数据/日志路径)

mongod --dbpath "D:\MongoDB\data\db" --logpath "D:\MongoDB\log\mongod.log" --logappend --install --serviceName "MongoDB"

3. 启动服务

net start MongoDB

场景 2:MSI 安装包(仅启动服务)

bash

bash 复制代码
C:\windows\system32>d:

D:\>cd MongoDB\bin

D:\MongoDB\bin>mongod --remove --serviceName "MongoDB"
{"t":{"$date":"2026-03-13T21:18:25.592+08:00"},"s":"I",  "c":"-",        "id":8991200, "ctx":"thread1","msg":"Shuffling initializers","attr":{"seed":1797161713}}
{"t":{"$date":"2026-03-13T21:18:25.610+08:00"},"s":"I",  "c":"CONTROL",  "id":97374,   "ctx":"thread1","msg":"Automatically disabling TLS 1.0 and TLS 1.1, to force-enable TLS 1.1 specify --sslDisabledProtocols 'TLS1_0'; to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
{"t":{"$date":"2026-03-13T21:18:25.729+08:00"},"s":"I",  "c":"NETWORK",  "id":4915701, "ctx":"thread1","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":27},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":27},"outgoing":{"minWireVersion":6,"maxWireVersion":27},"isInternalClient":true}}}
{"t":{"$date":"2026-03-13T21:18:25.732+08:00"},"s":"I",  "c":"CONTROL",  "id":23307,   "ctx":"thread1","msg":"Trying to remove Windows service","attr":{"name":"MongoDB"}}
{"t":{"$date":"2026-03-13T21:18:25.788+08:00"},"s":"I",  "c":"CONTROL",  "id":23310,   "ctx":"thread1","msg":"Service is currently running, stopping service","attr":{"serviceName":"MongoDB"}}
{"t":{"$date":"2026-03-13T21:18:25.788+08:00"},"s":"I",  "c":"CONTROL",  "id":23311,   "ctx":"thread1","msg":"Service stopped","attr":{"serviceName":"MongoDB"}}
{"t":{"$date":"2026-03-13T21:18:25.789+08:00"},"s":"I",  "c":"CONTROL",  "id":23312,   "ctx":"thread1","msg":"Service removed","attr":{"serviceName":"MongoDB"}}

D:\MongoDB\bin>mongod --dbpath "D:\MongoDB\data\db" --logpath "D:\MongoDB\log\mongod.log" --logappend --install --serviceName "MongoDB"
{"t":{"$date":"2026-03-13T21:18:45.096+08:00"},"s":"I",  "c":"-",        "id":8991200, "ctx":"thread1","msg":"Shuffling initializers","attr":{"seed":3716484231}}

D:\MongoDB\bin>net start MongoDB
MongoDB 服务正在启动 .
MongoDB 服务已经启动成功。


D:\MongoDB\bin>

直接启动服务

net start MongoDB

步骤 3:验证服务启动

成功输出:MongoDB 服务已经启动成功。;

辅助验证:Win+R 输入 services.msc → 「MongoDB Server」状态为「正在运行」。

五、Python 连接验证

步骤 1:安装 Python 驱动

bash

运行

pip install pymongo

步骤 2:编写测试代码(任意目录运行)

python

python 复制代码
from pymongo import MongoClient
from bson.objectid import ObjectId

client = MongoClient("mongodb://localhost:27017/")
db = client["test_db"]
collection = db["users"]

# 去重插入:根据name判断,不存在则插入,存在则更新age
user = {"name": "李四", "age": 30, "address": {"city": "上海", "district": "浦东新区"}}
collection.update_one(
    {"name": "李四"},  # 查询条件(根据name去重)
    {"$set": user},     # 要插入/更新的数据
    upsert=True         # 不存在则插入,存在则更新
)

# 查询并格式化输出
query = {"age": {"$gt": 20}}
results = list(collection.find(query))
results = [{**doc, "_id": str(doc["_id"])} for doc in results]
print("MongoDB查询结果:", results)

client.close()

运行

python 复制代码
from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError

try:
    # 连接本地 MongoDB(默认端口27017)
    client = MongoClient("mongodb://localhost:27017/", serverSelectionTimeoutMS=5000)
    client.admin.command('ping')  # 验证连接
    print("✅ MongoDB 连接成功!")

    # 插入+查询测试
    db = client["test_db"]
    collection = db["users"]
    collection.insert_one({"name": "李四", "age": 30, "address": {"city": "上海"}})
    results = list(collection.find({"age": {"$gt": 20}}))
    # 格式化输出
    results = [{**doc, "_id": str(doc["_id"])} for doc in results]
    print("📊 查询结果:", results)
except ServerSelectionTimeoutError:
    print("❌ 连接失败:请检查 MongoDB 服务是否启动")
finally:
    client.close()

步骤 3:验证结果

成功输出:显示插入的数据,无报错 → MongoDB 部署完成。

六、常用服务管理命令(管理员 CMD)

bash

运行

启动服务

net start MongoDB

停止服务

net stop MongoDB

卸载服务

mongod --remove --serviceName "MongoDB"

临时启动(无需注册服务,测试用)

mongod --dbpath "D:\MongoDB\data\db" --port 27017 --bind_ip 127.0.0.1

核心关键点回顾

路径必须无中文 / 空格,否则服务注册 / 启动失败;

权限配置是核心:修改目录所有者 + 添加完全控制权限,解决日志写入报错;

服务注册后为开机自启,无需每次手动启动 mongod 进程;

Python 连接无需和 MongoDB 同目录,只需保证 27017 端口可访问。

第二部分 将MYSQL 库转移到MONGODB 中

python 复制代码
from pymongo import MongoClient
from tabulate import tabulate  # 需先安装:pip install tabulate
import textwrap

# 1. 连接MongoDB
client = MongoClient('mongodb://localhost:27017/')

# 2. 格式化输出函数(核心工具)
def print_mongo_data(data, title="查询结果", page_size=10, show_index=True):
    """
    格式化输出MongoDB查询结果
    :param data: 查询到的列表数据
    :param title: 结果标题
    :param page_size: 每页显示条数
    :param show_index: 是否显示行号
    """
    if not data:
        print(f"\n❌ {title}:无数据")
        return
    
    # 提取所有字段名(去重)
    all_fields = set()
    for doc in data:
        all_fields.update(doc.keys())
    fields = sorted(list(all_fields))
    
    # 构造表格数据
    table_data = []
    for idx, doc in enumerate(data):
        row = []
        for field in fields:
            # 处理长文本换行
            value = doc.get(field, "无数据")
            if isinstance(value, str) and len(value) > 30:
                value = textwrap.shorten(value, width=30, placeholder="...")
            row.append(value)
        if show_index:
            row.insert(0, idx+1)  # 插入行号
        table_data.append(row)
    
    # 构造表头
    headers = fields
    if show_index:
        headers.insert(0, "序号")
    
    # 分页显示
    total_pages = (len(table_data) + page_size - 1) // page_size
    print(f"\n📊 {title}(共{len(data)}条,{total_pages}页)")
    
    for page in range(total_pages):
        start = page * page_size
        end = min((page+1)*page_size, len(table_data))
        page_data = table_data[start:end]
        
        print(f"\n--- 第{page+1}页 ---")
        # 用tabulate生成表格(支持多种格式)
        print(tabulate(page_data, headers=headers, tablefmt="grid", stralign="left"))
        
        # 非最后一页,提示翻页
        if page < total_pages - 1:
            input("\n按Enter查看下一页(输入q退出)... ")
            if input().lower() == 'q':
                break

# 3. 封装常用查询函数
def query_actors():
    """查询cookbook.actors集合"""
    db = client['cookbook']
    col = db['actors']
    data = list(col.find({}, {'_id': 0}))  # 排除MongoDB自动生成的_id
    print_mongo_data(data, title="演员信息")

def query_high_salary_emp(min_salary=50000, limit=20):
    """查询工资大于指定值的员工"""
    db = client['employees']
    col = db['salaries']
    # 只查询关键字段,减少数据量
    data = list(col.find(
        {'salary': {'$gt': min_salary}},
        {'_id': 0, 'emp_no': 1, 'salary': 1, 'from_date': 1, 'to_date': 1}
    ).limit(limit))
    print_mongo_data(data, title=f"工资>{min_salary}的员工", page_size=8)

def query_emp_salary(emp_no):
    """查询指定员工的工资记录"""
    db = client['employees']
    col = db['salaries']
    data = list(col.find(
        {'emp_no': emp_no},
        {'_id': 0}
    ).sort('from_date', 1))  # 按时间升序
    print_mongo_data(data, title=f"员工{emp_no}的工资记录", page_size=5)

def query_salary_stats(emp_no):
    """统计指定员工的工资信息"""
    db = client['employees']
    col = db['salaries']
    stats = list(col.aggregate([
        {'$match': {'emp_no': emp_no}},
        {'$group': {
            '_id': '$emp_no',
            '最高工资': {'$max': '$salary'},
            '最低工资': {'$min': '$salary'},
            '平均工资': {'$avg': '$salary'},
            '工资记录数': {'$sum': 1}
        }}
    ]))
    # 转换格式以便显示
    stats_data = []
    for stat in stats:
        stats_data.append({
            '员工编号': stat['_id'],
            '最高工资': stat['最高工资'],
            '最低工资': stat['最低工资'],
            '平均工资': round(stat['平均工资'], 2),
            '工资记录数': stat['工资记录数']
        })
    print_mongo_data(stats_data, title=f"员工{emp_no}工资统计")

# ==================== 调用示例 ====================
if __name__ == "__main__":
    # 1. 查看演员信息(表格格式)
    query_actors()
    
    # 2. 查看工资>5万的员工(分页)
    query_high_salary_emp(min_salary=80000, limit=16)
    
    # 3. 查看指定员工工资记录
    query_emp_salary(emp_no=10001)
    
    # 4. 查看指定员工工资统计
    query_salary_stats(emp_no=10001)
python 复制代码
=================== RESTART: D:/Python/HeiMa/test_mongo6.2.py ==================

📊 演员信息(共10条,1页)

--- 第1页 ---
+--------+---------------+------+
|   序号 | actor         |   id |
+========+===============+======+
|      1 | Bruce Willis  |    1 |
+--------+---------------+------+
|      2 | Diane Kruger  |    2 |
+--------+---------------+------+
|      3 | Elijah Wood   |    3 |
+--------+---------------+------+
|      4 | Ewan McGregor |    4 |
+--------+---------------+------+
|      5 | Gary Oldman   |    5 |
+--------+---------------+------+
|      6 | Helen Mirren  |    6 |
+--------+---------------+------+
|      7 | Ian Holm      |    7 |
+--------+---------------+------+
|      8 | Ian McKellen  |    8 |
+--------+---------------+------+
|      9 | Liam Neeson   |    9 |
+--------+---------------+------+
|     10 | Orlando Bloom |   10 |
+--------+---------------+------+

📊 工资>80000的员工(共16条,2页)

--- 第1页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|      1 |    10001 | 1996-06-23 00:00:00 |    80013 | 1997-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      2 |    10001 | 1997-06-23 00:00:00 |    81025 | 1998-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      3 |    10001 | 1998-06-23 00:00:00 |    81097 | 1999-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      4 |    10001 | 1999-06-23 00:00:00 |    84917 | 2000-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      5 |    10001 | 2000-06-22 00:00:00 |    85112 | 2001-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      6 |    10001 | 2001-06-22 00:00:00 |    85097 | 2002-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      7 |    10001 | 2002-06-22 00:00:00 |    88958 | 9999-01-01 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      8 |    10005 | 1990-09-12 00:00:00 |    82621 | 1991-09-12 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

按Enter查看下一页(输入q退出)... 


--- 第2页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|      9 |    10005 | 1991-09-12 00:00:00 |    83735 | 1992-09-11 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     10 |    10005 | 1992-09-11 00:00:00 |    85572 | 1993-09-11 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     11 |    10005 | 1993-09-11 00:00:00 |    85076 | 1994-09-11 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     12 |    10005 | 1994-09-11 00:00:00 |    86050 | 1995-09-11 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     13 |    10005 | 1995-09-11 00:00:00 |    88448 | 1996-09-10 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     14 |    10005 | 1996-09-10 00:00:00 |    88063 | 1997-09-10 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     15 |    10005 | 1997-09-10 00:00:00 |    89724 | 1998-09-10 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     16 |    10005 | 1998-09-10 00:00:00 |    90392 | 1999-09-10 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

📊 员工10001的工资记录(共17条,4页)

--- 第1页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|      1 |    10001 | 1986-06-26 00:00:00 |    60117 | 1987-06-26 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      2 |    10001 | 1987-06-26 00:00:00 |    62102 | 1988-06-25 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      3 |    10001 | 1988-06-25 00:00:00 |    66074 | 1989-06-25 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      4 |    10001 | 1989-06-25 00:00:00 |    66596 | 1990-06-25 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      5 |    10001 | 1990-06-25 00:00:00 |    66961 | 1991-06-25 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

按Enter查看下一页(输入q退出)... 




--- 第2页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|      6 |    10001 | 1991-06-25 00:00:00 |    71046 | 1992-06-24 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      7 |    10001 | 1992-06-24 00:00:00 |    74333 | 1993-06-24 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      8 |    10001 | 1993-06-24 00:00:00 |    75286 | 1994-06-24 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|      9 |    10001 | 1994-06-24 00:00:00 |    75994 | 1995-06-24 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     10 |    10001 | 1995-06-24 00:00:00 |    76884 | 1996-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

按Enter查看下一页(输入q退出)... 
--- 第3页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|     11 |    10001 | 1996-06-23 00:00:00 |    80013 | 1997-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     12 |    10001 | 1997-06-23 00:00:00 |    81025 | 1998-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     13 |    10001 | 1998-06-23 00:00:00 |    81097 | 1999-06-23 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     14 |    10001 | 1999-06-23 00:00:00 |    84917 | 2000-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     15 |    10001 | 2000-06-22 00:00:00 |    85112 | 2001-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

按Enter查看下一页(输入q退出)... 


--- 第4页 ---
+--------+----------+---------------------+----------+---------------------+
|   序号 |   emp_no | from_date           |   salary | to_date             |
+========+==========+=====================+==========+=====================+
|     16 |    10001 | 2001-06-22 00:00:00 |    85097 | 2002-06-22 00:00:00 |
+--------+----------+---------------------+----------+---------------------+
|     17 |    10001 | 2002-06-22 00:00:00 |    88958 | 9999-01-01 00:00:00 |
+--------+----------+---------------------+----------+---------------------+

📊 员工10001工资统计(共1条,1页)

--- 第1页 ---
+--------+------------+--------------+------------+------------+------------+
|   序号 |   员工编号 |   工资记录数 |   平均工资 |   最低工资 |   最高工资 |
+========+============+==============+============+============+============+
|      1 |      10001 |           17 |    75388.9 |      60117 |      88958 |
+--------+------------+--------------+------------+------------+------------+

三、使用说明

安装依赖:先执行 pip install tabulate 安装表格格式化库

自定义调整:

page_size:调整每页显示的条数(默认 10 条)

min_salary:调整工资筛选阈值

limit:限制查询结果总数,避免数据过多

tablefmt:支持多种表格格式(grid/pretty/simple/markdown等)

扩展查询:可以仿照 query_actors() 封装其他集合的查询函数(如 denver_crime、university.student)

四、进阶优化(可选)

如果觉得还是不够直观,可以添加数据可视化(比如员工工资变化趋势):

python 复制代码
python
运行
import matplotlib.pyplot as plt

def plot_emp_salary_trend(emp_no):
    """绘制员工工资变化趋势图"""
    db = client['employees']
    col = db['salaries']
    data = list(col.find(
        {'emp_no': emp_no},
        {'_id': 0, 'salary': 1, 'from_date': 1}
    ).sort('from_date', 1))
    
    # 提取数据
    salaries = [doc['salary'] for doc in data]
    dates = [doc['from_date'].split()[0] for doc in data]  # 只取日期部分
    
    # 绘图
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 支持中文
    plt.figure(figsize=(12, 6))
    plt.plot(dates, salaries, marker='o', color='#2E86AB', linewidth=2)
    plt.title(f'员工{emp_no}工资变化趋势', fontsize=14)
    plt.xlabel('日期', fontsize=12)
    plt.ylabel('工资(美元)', fontsize=12)
    plt.xticks(rotation=45)
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.show()

调用绘图函数

plot_emp_salary_trend(emp_no=10001)

总结

使用 tabulate 库将原始列表数据转换成表格格式,大幅提升可读性。

封装查询函数并添加分页功能,避免一次性显示大量数据导致刷屏。

可通过数据统计和可视化进一步简化数据查看,聚焦核心信息。

核心思路:先过滤 / 提取关键字段,再格式化展示,最后按需分页 / 可视化。

当前效果的核心优势(确认)

✅ 结构化表格:用 grid 格式展示,字段对齐、层次清晰,比纯文本易读 10 倍;

✅ 分页控制:大量数据(如员工 10001 的 17 条工资记录)自动分页,避免刷屏;

✅ 关键信息保留:过滤了无用的 _id 字段,只展示业务相关字段(emp_no/salary 等);

✅ 统计汇总:工资统计直接算出最高 / 最低 / 平均工资,不用手动计算。

五、小优化(可选,让使用更便捷)

如果你觉得翻页时每次按 Enter 有点麻烦,可以调整这 2 处:

python 复制代码
python
运行
# 1. 优化翻页逻辑(输入空直接翻页,输入q退出)
if page < total_pages - 1:
    user_input = input("\n按Enter查看下一页(输入q退出)... ").strip()
    if user_input.lower() == 'q':
        break

# 2. 可选:调整默认分页大小(比如工资记录每页显示8条,减少翻页次数)
def query_emp_salary(emp_no):
    """查询指定员工的工资记录"""
    db = client['employees']
    col = db['salaries']
    data = list(col.find(
        {'emp_no': emp_no},
        {'_id': 0}
    ).sort('from_date', 1))  # 按时间升序
    print_mongo_data(data, title=f"员工{emp_no}的工资记录", page_size=8)  # 每页8条
三、扩展使用建议(针对你迁移的其他数据)
你可以仿照现有函数,快速封装其他集合的查询:
python
运行
# 示例:查询university库的学生信息
def query_university_student(limit=20):
    """查询大学学生信息"""
    db = client['university']
    col = db['student']
    data = list(col.find(
        {},
        {'_id': 0, 'student_id': 1, 'name': 1, 'age': 1, 'major': 1}
    ).limit(limit))
    print_mongo_data(data, title="大学学生信息", page_size=10)

# 示例:查询crime_db的犯罪数据(前20条)
def query_denver_crime(limit=20):
    """查询丹佛犯罪数据"""
    db = client['crime_db']
    col = db['denver_crime']
    data = list(col.find(
        {},
        {'_id': 0, 'crime_type': 1, 'date': 1, 'district': 1, 'status': 1}
    ).limit(limit))
    print_mongo_data(data, title="丹佛犯罪数据", page_size=8)

# 调用
query_university_student()
query_denver_crime()

小结

当前的展示效果完全符合预期,表格化 + 分页让 MongoDB 查询结果从 "难读" 变 "易读";

核心工具是 print_mongo_data 函数,可复用在所有集合的查询结果展示;

如需查询其他集合,只需仿照现有函数封装,替换数据库名 / 集合名 / 字段即可。

第三部分 mongosh 安装

如果想使用 mongosh,可以手动下载安装:

访问 MongoDB 官网:https://www.mongodb.com/try/download/shell

下载 Windows 版本的 mongosh,解压后将 mongosh.exe 复制到 D:\MongoDB\bin 目录下;

重新打开 CMD,执行 mongosh 即可使用。

当前的安装路径 D:\MongoDB\bin\ 是完全正确的 ✅。
为什么这样选是对的?

和现有 MongoDB 服务统一目录:你的 MongoDB 主程序(mongod.exe)已经在 D:\MongoDB\bin 目录下,把 mongosh.exe 安装到同一个目录,后续在 CMD 里直接输入 mongosh 就能调用,不需要额外配置环境变量。

避免路径混乱:如果安装到其他目录,会导致 mongod 和 mongosh 分离,后续操作和维护会更麻烦。

权限适配:勾选了 Install just for you (lenovo),这是当前用户权限下的安装,不会影响系统其他用户,也符合你当前的使用场景。

下一步操作建议

直接点击 Next 完成安装即可,安装完成后:

重新打开一个 CMD 窗口

输入 mongosh 就能进入 MongoDB 的新版交互终端了

相关推荐
微学AI3 小时前
飞牛 NAS 部署 prompts.chat:自建提示词库、导入社区内容,再配置固定公网访问
数据库·内网穿透
羑悻的小杀马特3 小时前
从写 YAML 到集群自愈:KES-Operator 把 KES 集群接进 Kubernetes 原生体系
运维·数据库·容器·kubernetes
bksczm3 小时前
MySQL基础篇之事务
linux·数据库·sql·mysql
李白客3 小时前
数据库管理工具怎么选?Navicat、DataGrip、DBeaver 六维横向对比与选型建议
运维·数据库
马立杰3 小时前
mysql中Illegal mix of collations for operation “UNION”错误的解决方法
数据库·sql·网络安全
蓝速科技3 小时前
蓝速 K10 三防平板在工业恶劣工况下的选型与应用指南
大数据·运维·数据库·人工智能·科技
bksczm3 小时前
MySQL基础篇之视图与用户管理
linux·数据库·sql·mysql
香菜TTT3 小时前
怎么实现MySQL的主从同步机制
数据库·mysql
2501_9336707912 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
我要见SA姐114 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归