MongoDB系列教程-第四章:MongoDB Compass可视化和管理MongoDB数据库
📖 第四章:MongoDB Compass可视化和管理MongoDB数据库
文章目录
- 4.1 MongoDB Compass介绍
- 4.2 MongoDB Compass下载及安装
- 4.3 MongoDB Compass连接数据库
- 4.4 MongoDB Compass增查改删操作
- 4.4.1 增加
- 4.4.2 查询
- 4.4.3 修改
- 4.4.4 删除
- 4.5 数据导入与导出
- 4.5.1 数据导入
- 4.5.2 数据导出
4.1 MongoDB Compass介绍
MongoDB Compass 是 MongoDB 官方推出的 可视化管理工具,可以直观地操作 MongoDB 数据库。它提供了图形化界面,替代了传统的命令行操作,适合开发者、数据分析师等用户快速查看、编辑、查询数据,以及管理数据库结构。
优势:
- 可视化交互:通过界面直接操作数据库,无需记忆复杂命令。
- 实时数据分析:自动生成集合的 schema 分析、索引建议等。
- 查询构建器:通过拖拽或表单生成查询语句,降低使用门槛。
- 跨平台支持:兼容 Windows、macOS、Linux 系统。
4.2 MongoDB Compass下载及安装
正如第一章中介绍的,如果在安装MongoDB软件的时候,勾选了MongoDB Compass(默认)则自动会安装MongoDB Compass,默认安装在了C:\Users\i\AppData\Local\MongoDBCompass
,同时桌面也会有快捷方式。
双击打开是这个样子:
如果没有安装MongoDB Compass,则可以官方下载,地址:https://www.mongodb.com/try/download/compass,根据操作系统选择对应版。
安装步骤:
- Windows:运行 .msi 安装包,跟随向导完成安装(可勾选「Add to PATH」方便启动)。
- macOS:打开 .dmg 文件,将 Compass 拖入「应用程序」文件夹。
- Linux:根据发行版选择 .deb 或 .rpm 包,使用 dpkg 或 yum 安装。
4.3 MongoDB Compass连接数据库
左侧点击新建「New Connection」连接。
让输入URL,关于这个URL在 MongoDB系列教程-第一章:MongoDB简介、安装 、概念解析、用户管理、连接、实际应用示例中的1.6小节【连接】已经介绍了,我这里再重复说明一下。
使用 MongoDB shell 来连接 MongoDB 服务器,标准的 URI 连接语法:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
mongodb://
:协议头,表示使用 MongoDB。[username:password@]
:(可选)认证信息,包括用户名和密码。host1[:port1][,...hostN[:portN]]
:服务器地址和端口,可以是一个或多个 MongoDB 服务器的地址和端口。/[defaultauthdb]
:(可选)默认认证数据库。[?options]
:(可选)连接选项。
标准的连接格式包含了多个选项(options),如下所示:
authSource
:指定认证数据库。replicaSet
:指定副本集的名称。ssl
:启用 SSL 连接(true 或 false)。readPreference
:指定读偏好,如 primary, primaryPreferred, secondary, secondaryPreferred, nearest。connectTimeoutMS
:指定连接超时时间(毫秒)。socketTimeoutMS
:指定套接字超时时间(毫秒)。
一些示例:
连接到本地 MongoDB 实例(默认端口 27017):
mongodb://localhost连接到本地 MongoDB 实例,指定数据库:
mongodb://localhost/mydatabase使用用户名和密码连接到本地 MongoDB 实例:
mongodb://username:password@localhost/mydatabase连接到远程 MongoDB 实例:
mongodb://remotehost:27017连接到副本集(Replica Set):
mongodb://host1:27017,host2:27017,host3:27017/mydatabase?replicaSet=myReplicaSet使用 SSL 连接到 MongoDB:
mongodb://username:password@localhost:27017/mydatabase?ssl=true使用多个选项连接:
mongodb://username:password@localhost:27017/mydatabase?authSource=admin&ssl=true
默认显示的连接配置项除了 URL,还包括Name、Color 等,主要用于定义连接 MongoDB 的方式和属性,详细说明:
-
默认 URL(Connection String)
- 默认值:
mongodb://localhost:27017/
- 含义:这是连接字符串的标准格式,用于指定 MongoDB 服务的地址、端口及认证信息等。
- 设置方式:
- 本地无认证服务:默认值可直接使用(适用于本地启动的 mongod 服务,未启用 --auth)。
- 带认证的服务:需添加用户名和密码,格式为
mongodb://用户名:密码@主机:端口/数据库名?authSource=admin
。
示例:mongodb://admin:123456@localhost:27017/myapp?authSource=admin
(authSource=admin
表示从 admin 数据库验证权限)。 - 远程服务或云数据库:替换
localhost:27017
为实际的 IP: 端口或域名,例如mongodb://192.168.1.100:27017/
。 - MongoDB Atlas 集群:使用官网提供的
mongodb+srv://
格式连接字符串。
- 默认值:
-
Name(连接名称)
- 作用:为当前连接设置一个易识别的名称(如「本地测试库」「生产环境主库」),方便在 Compass 左侧的连接列表中区分不同连接,避免混淆。
- 设置建议:根据连接的用途命名,例如连接本地服务可填「Local MongoDB」,连接远程生产库可填「Production Cluster」。
-
Color(连接颜色)
- 作用:为连接设置一个标识颜色,在左侧连接列表中以小色块显示,用于快速视觉区分(尤其当连接较多时)。
- 设置方式:点击颜色选择器,从预设颜色中选择(无特殊要求,按个人习惯或场景分类即可,例如生产环境用红色,测试环境用绿色)。
-
Favorite this connection(收藏连接)
- 说明:勾选后,当前连接会「置顶」显示在左侧连接列表的顶部,方便快速访问常用连接。
- 适用场景:建议收藏日常频繁使用的连接(如本地开发库、常用测试环境),不常用的连接可不勾选。
-
Advanced Connection Options(高级选项)
关于这个高级选项,点击后可以了解一下最后面的「Advanced」,点击「Advanced」会出现Default、Primary、Primary Preferred、Secondary、Secondary Preferred、Nearest,主要用于指定连接到 MongoDB 复制集时的节点选择策略,含义如下:
- Default:默认选项,通常会使用与 “Primary Preferred” 类似的策略,即优先连接到主节点,如果主节点不可用,则尝试连接到从节点。
- Primary:表示只连接到复制集的主节点。主节点负责处理所有的写操作,并且默认情况下也处理读操作(除非启用了读偏好设置让从节点参与读)。使用此选项,当主节点不可用时,连接会失败,因为它不会尝试连接到从节点。
- Primary Preferred:优先连接到主节点。如果主节点可用,就连接到主节点;若主节点不可用,则会尝试连接到从节点。这种策略适用于大多数读写操作场景,既保证了优先使用主节点进行操作,又能在主节点故障时提供一定的容错能力。
- Secondary:表示只连接到复制集的从节点。从节点主要用于复制主节点的数据,通常可以用于只读操作,如报表生成、备份等。使用此选项可以将读操作分担到从节点,减轻主节点的压力,但不能进行写操作,因为从节点不接受写请求。
- Secondary Preferred:优先连接到从节点。如果有可用的从节点,就连接到从节点;只有当所有从节点都不可用时,才会尝试连接到主节点。该策略适合于一些对数据实时性要求不高的读操作场景,如后台数据分析等,可以最大限度地利用从节点资源,减少主节点负载。
- Nearest:连接到距离客户端最近的节点,这里的 “最近” 通常是根据网络延迟等因素来判断的。这种策略适用于分布式部署且对延迟敏感的场景,能让客户端快速获取数据,减少网络延迟带来的影响,但不保证连接到主节点还是从节点。
- Connection String Scheme(连接字符串协议)
- 选项:mongodb 和 mongodb+srv
- mongodb:标准连接协议,适用于大多数场景(单机服务、自建复制集、分片集群),需手动指定所有节点的地址和端口。
- mongodb+srv:简化的 SRV 协议,主要用于 MongoDB Atlas 云服务或支持 SRV 记录的集群,无需手动填写所有节点信息(通过 DNS 自动解析集群节点)。
- 选择建议:
- 本地服务、自建服务器:选 mongodb。
- MongoDB Atlas 或支持 SRV 的云集群:选 mongodb+srv(直接使用官方提供的 SRV 连接字符串)。
- Host(主机地址)
- 默认值:
localhost:27017
- 含义:指定 MongoDB 服务的主机地址和端口,格式为 IP:端口 或 域名:端口(默认端口为
27017
,若服务使用其他端口需对应修改)。
设置方式:- 本地服务:保持
localhost:27017
或127.0.0.1:27017
。 - 远程服务:替换为实际地址,例如
10.0.0.5:27017
或mongodb.example.com:27019
。 - 复制集集群:若手动指定多个节点,用逗号分隔,例如
node1:27017,node2:27017,node3:27017
。
- 本地服务:保持
- Direct Connection(直接连接)
- 含义:勾选后,强制所有操作直接发送到「Host」中指定的单个节点,不经过集群的自动节点选择(适用于复制集或分片集群场景)。
- 适用场景:
- 不勾选(默认):适合大多数情况,由 MongoDB 自动选择合适的节点(如主节点处理写操作,从节点分担读操作)。
- 勾选:仅用于调试或特殊需求(例如直接连接到从节点查看数据同步状态),一般不建议日常使用。
我这里为了简单测试,Name输入test,Color随便设置,点击保存和连接。
进入连接后,左侧出现test(我自己设置的连接的名称),它代表的是 “我与本地 MongoDB 实例(mongodb://localhost:27017/)的这个连接”。默认下面会列出admin
、config
、local
,即当前 MongoDB 实例中实际存在的数据库名称(不用管我这里出现的gps_mapping
)。
admin
、config
、local
是 MongoDB 默认创建的系统数据库,各自有其特定用途:
- admin:主要用于存储 MongoDB 的用户、角色等权限相关信息,是 MongoDB 的超级用户数据库。拥有 admin 库相关权限的用户,通常可以对所有数据库进行操作,执行管理员命令等。例如,
system.users
集合存储用户信息,system.roles
集合存储角色信息。 - config:主要在 MongoDB 的分片集群环境中发挥作用,用于存储分片的相关配置信息,如分片的元数据、分片服务器的地址等。如果当前 MongoDB 是单节点部署,没有启用分片功能,该数据库的使用场景相对较少。
- local:用于存储本地数据库实例的元数据和内部数据,比如副本集的配置信息、oplog 信息等。该数据库的数据不会被复制到副本集的其他成员中,是每个 MongoDB 进程独有的 “私人数据空间”,可用来存放无需复制的临时数据或特定于某个实例的数据。
4.4 MongoDB Compass增查改删操作
4.4.1 增加
首先,还是在test连接中,点击右侧的「 Create database」,弹窗需要我们输入 「 Database Name」和 「 Collection Name」,即分别是数据库名字和集合名字。
为用于测试,我这里随便输入了my_test_database1
和my_test_collection1
,点击创建。
【注意】:集合名字为必填项。
创建成功,向集合添加数据:
点击「Insert Docement」,向集合中添加数据:
插入数据时,这里涉及到Object ID和各种数据类型,这块的背景知识,可以参考 第一章的数据类型讲解,
我这里随便插入一条数据,输入:
/**
* Paste one or more documents here
*/
{ "baseline_id": "baseline_1", "video_info": {"path": "absolute/path/to/video.mp4", "hash": "md5_hash_string", "fps": 25, "total_frames": 17221, "duration_seconds": 688.84 },"tiff_info": {"path": "absolute/path/to/tiff.tif" },"transformation": {"tiff_to_gps_transform": [ 500000.0, 1.0, 0.0, 4000000.0, 0.0, -1.0 ]},"flight_metadata": { "total_distance": 5420.5, "avg_speed": 7.87, "frame_interval_1s": 25 },"gps_grid_file": "gps_grids/baseline_xxx.h5", "frames": [ {"frame_id": 3767, "center_pixel": [562237, 333885], "center_gps": [35.647156, 117.417040], "grid_bounds": {"normal": [557341, 330609, 567133, 337161], "extended": [554893, 328971, 569581, 338799] },"video_to_tiff_H": [ [1.0, 0.0, 0.0],[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]],"prev_frame_distance": 15.2, "next_frame_distance": 14.8, "timestamp_offset": 150.68 }]
}
插入成功:
4.4.2 查询
点击「Find」前需要输入的查询规则(这块的知识可以参考之前第二章的MongoDB文档操作指令 中的查询操作),(Filter)是用于筛选符合条件的文档,具体可根据数据中的字段结构设置以下几类规则:
1、针对基础字段的查询
-
精确匹配
直接指定字段的值,筛选完全匹配的文档。- 示例1:查询
baseline_id
为baseline_1
的文档{ "baseline_id": "baseline_1" }
- 示例2:查询
gps_grid_file
路径包含baseline_xxx.h5
的文档{ "gps_grid_file": "gps_grids/baseline_xxx.h5" }
- 示例1:查询
-
比较匹配
使用比较操作符($gt
/$gte
/$lt
/$lte
/$ne
等)筛选范围条件。- 示例1:查询视频时长(
duration_seconds
)大于 600 秒的文档{ "video_info.duration_seconds": { "$gt": 600 } }
- 示例2:查询飞行平均速度(
avg_speed
)不等于 7.87 的文档{ "flight_metadata.avg_speed": { "$ne": 7.87 } }
- 示例1:查询视频时长(
2、针对嵌套文档的查询
我的数据中包含 video_info
、tiff_info
等嵌套文档,可通过「外层字段.
内层字段」的格式访问。
- 示例1:查询视频帧率(
fps
)为 25 的文档{ "video_info.fps": 25 }
- 示例2:查询 TIFF 文件路径(
path
)包含tiff.tif
的文档{ "tiff_info.path": "absolute/path/to/tiff.tif" }
3、针对数组的查询
-
普通数组(如
tiff_to_gps_transform
)- 示例:查询变换矩阵中第一个元素为 500000.0 的文档
({ "transformation.tiff_to_gps_transform.0": 500000.0 }
0
表示数组的第一个元素,数组索引从 0 开始)
- 示例:查询变换矩阵中第一个元素为 500000.0 的文档
-
对象数组(如
frames
)
frames
是包含多个对象的数组,可通过「数组字段.对象字段」筛选。- 示例1:查询
frames
中存在frame_id
为 3767 的文档{ "frames.frame_id": 3767 }
- 示例2:查询
frames
中center_gps
纬度(数组第一个元素)大于 35.6 的文档{ "frames.center_gps.0": { "$gt": 35.6 } }
- 示例3:查询
frames
中prev_frame_distance
小于 16 的文档{ "frames.prev_frame_distance": { "$lt": 16 } }
- 示例1:查询
4、逻辑组合查询
使用逻辑操作符($and
/$or
等)组合多个条件。
- 示例1:同时满足「帧率为 25」和「总帧数大于 10000」的文档
{ "$and": [{ "video_info.fps": 25 },{ "video_info.total_frames": { "$gt": 10000 } }] }
- 示例2:满足「飞行总距离大于 5000」或「平均速度小于 8」的文档
{ "$or": [{ "flight_metadata.total_distance": { "$gt": 5000 } },{ "flight_metadata.avg_speed": { "$lt": 8 } }] }
5、正则表达式查询(模糊匹配)
对字符串字段进行模糊筛选,使用 $regex
操作符。
- 示例1:查询
baseline_id
以baseline_
开头的文档{ "baseline_id": { "$regex": "^baseline_" } }
- 示例2:查询视频路径(
video_info.path
)包含mp4
的文档{ "video_info.path": { "$regex": "mp4" } }
关于【Compass 中查询配置与 MongoDB Shell 指令的关系】
Compass 中的 Filter
、Project
、Sort
、Skip
、Limit
本质上对应 MongoDB Shell 中 find()
方法的相关参数和链式操作,两者功能一致,只是形式不同:
Compass 配置 | 作用描述 | 对应 MongoDB Shell 指令 |
---|---|---|
Filter | 设置查询条件,筛选符合条件的文档 | db.集合名.find({查询条件}) 中的 {查询条件} 部分,例如:db.your_collection.find({ "video_info.fps": 25 }) |
Project | 限制返回的字段(显示/隐藏指定字段) | find() 方法的第二个参数,例如:db.your_collection.find({...}, { "baseline_id": 1, "video_info.path": 1, "_id": 0 }) (1 表示显示,0 表示隐藏) |
Sort | 按指定字段排序(升序/降序) | 链式调用 sort() 方法,例如:db.your_collection.find({...}).sort({ "flight_metadata.total_distance": -1 }) (-1 表示降序,1 表示升序) |
Skip | 跳过前 N 条结果 | 链式调用 skip() 方法,例如:db.your_collection.find({...}).skip(10) (跳过前 10 条) |
Limit | 限制返回结果的数量 | 链式调用 limit() 方法,例如:db.your_collection.find({...}).limit(5) (只返回 5 条) |
【总结说明】
Compass 中的查询配置是可视化的操作界面,而 MongoDB Shell 是通过命令行指令实现相同功能。例如,在 Compass 中设置 Filter: { "video_info.fps": 25 }
、Sort: { "flight_metadata.avg_speed": 1 }
、Limit: 10
,等价于在 Shell 中执行:
db.my_test_collection1.find({ "video_info.fps": 25 }).sort({ "flight_metadata.avg_speed": 1 }).limit(10)
两者最终都会向 MongoDB 服务器发送相同的查询请求,返回一致的结果。
4.4.3 修改
修改比较简单,在要修改的文档的后面点击修改按钮,进行修改(也可删除)即可。
4.4.4 删除
删除比较简单,点击相应删除按钮,删除数据库、集合或文档。
4.5 数据导入与导出
4.5.1 数据导入
点击「ImportJSONorCSV file」,然后选择本地JSON或者CSV文件即可。
4.5.2 数据导出
有两个选项:
- Export query results:会根据在导出前设置的查询条件(Filter)来导出数据。也就是说,只有符合查询条件的文档才会被导出,可以通过设置筛选条件来精准获取并导出所需的数据子集。例如,设置筛选条件为 “baseline_id: ‘baseline_1’”,那么就只会导出包含此 “baseline_id” 值的文档数据。
- Export the full collection:此选项会将整个集合中的所有文档都导出,无论文档内容是什么,也不管是否设置了查询条件,集合里的全部数据都会被包含在导出文件中。
另外,也可以设置导出的文件格式: