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 的新版交互终端了

相关推荐
银河麒麟操作系统1 小时前
银河麒麟服务器操作系统IO机制详解
数据库·redis·缓存
OxyTheCrack2 小时前
【C++】一篇文章悲观锁与乐观锁与其思想在C++语言中的应用
linux·开发语言·数据库·c++·笔记
执笔论英雄2 小时前
【cuda】 pinpaged
android·java·数据库
一招定胜负2 小时前
大模型的API调用
数据库
czlczl200209252 小时前
插入时先写DB后写Redis?分布式中传统双写模式的缺陷
数据库·redis·分布式
数据知道2 小时前
MongoDB分片集群备份与恢复:复杂环境下的数据保护方案详解
数据库·mongodb
桌面运维家2 小时前
Linux VHD 虚拟磁盘更新指南:高效管理与优化
linux·运维·数据库
宇灬宇2 小时前
Oracle 到 PostgreSQL迁移(ora2pg)
数据库·postgresql·oracle
泯仲2 小时前
从零起步学习MySQL 第九章:从数据页的角度看B+树及MySQL中数据的底层存储原理
数据库·b树·mysql