MongoDB(Windows 系统)下载 - 安装 - 配置完整步骤小结
一、前期准备
- 环境要求
系统:Windows 10/11(64 位)
权限:需管理员权限(修改目录权限、注册系统服务)
路径要求:安装目录禁止含中文 / 空格 / 特殊字符(推荐 D:\MongoDB) - 下载安装包

官方下载地址: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 的新版交互终端了