
使用 NoSQLBooster 连接 FerretDBMongoDB GUI 查询、聚合与监控实战指南【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址: https://gitcode.com/gh_mirrors/fe/FerretDBFerretDB 是一个真正开源的 MongoDB 替代品它把 MongoDB 5.0 的线协议Wire Protocol查询转换为 SQL并以 PostgreSQL DocumentDB 扩展作为数据库引擎见 README.md。这意味着任何支持 MongoDB 协议的客户端——包括各类 MongoDB GUI——都可以直接连上 FerretDB。本指南以 NoSQLBooster 这款跨平台 MongoDB GUI 为例完整演示从 Docker 部署 FerretDB、建立连接、灌入演示数据到可视化查询、聚合管道、集合统计与 Visual Explain 监控的完整链路。读完本文你将掌握一套可复现的 MongoDB GUI 开源文档数据库 实战方案并理解其背后的命令实现原理。为什么选择 NoSQLBooster 搭配 FerretDBNoSQLBooster 是一款跨平台的 MongoDB 图形化管理工具。将它与 FerretDB 配合使用可以完整调用 NoSQLBooster 的内置能力包括Query Code Generator自动把可视化查询条件翻译成 Mongo Shell 代码SQL Query 功能用 SQL 语法查询文档数据Comprehensive Server Monitoring一站式服务器与集合监控Intellisense在 Mongo Shell 中提供自动补全。从服务端角度看FerretDB 对客户端是透明的它通过internal/clientconn监听 MongoDB 协议的 TCP 端口默认27017把 BSON 请求分发到internal/handler中对应的命令处理器再经由internal/handler/commands.go中注册的命令表路由执行。因此只要是符合 MongoDB 协议的工具如 NoSQLBooster、Studio 3T、mongosh 等都能以几乎相同的方式连接并使用 FerretDB。本博客撰写于 FerretDB 1.x 时期当时默认后端为 PostgreSQL并曾提供 SQLite 后端的 beta 支持而当前仓库主线v2已经演进为以 PostgreSQL DocumentDB 扩展作为数据库引擎兼容性目标保持不变——这一点从 README.md 的架构图Any MongoDB driver → FerretDB → PostgreSQL DocumentDB可以看出。安装与启动Docker Compose 部署 FerretDB启动 FerretDB 有多种方式官方提供的ferretdb-eval:2镜像可以一条命令快速体验但数据保存在容器内、容器销毁即丢失不适合生产更稳妥的方式是使用 Docker Compose 同时拉起 PostgreSQL 与 FerretDB 两个服务。在本地安装 Docker 后创建如下docker-compose.ymlservices: postgres: image: postgres environment: - POSTGRES_USERusername - POSTGRES_PASSWORDpassword - POSTGRES_DBferretdb volumes: - ./data:/var/lib/postgresql/data ferretdb: image: ghcr.io/ferretdb/ferretdb restart: on-failure ports: - 27017:27017 environment: - FERRETDB_POSTGRESQL_URLpostgres://postgres:5432/ferretdb networks: default: name: ferretdb随后在终端执行docker compose up -d几点实操说明postgres服务负责初始化数据库并创建用户务必把username和password替换成你自己的凭据ferretdb服务通过FERRETDB_POSTGRESQL_URL指向 PostgreSQL并把 MongoDB 协议端口27017暴露到宿主机。restart: on-failure保证 FerretDB 在异常退出后自动拉起。当前仓库根目录下的 docker-compose.yml 是开发环境专用的编排文件包含 DocumentDB 扩展构建、测试用 MongoDB 实例、Jaeger 链路追踪等并不用于生产如果你想参考更贴近当前 v2 架构的 Compose 写法可以查看 authentication.md 中基于ghcr.io/ferretdb/postgres-documentdb:17ghcr.io/ferretdb/ferretdb:2的示例。安装 NoSQLBooster前往 NoSQLBooster 官网的下载页获取对应平台的安装包安装完成后启动应用即可进入连接配置环节。建立连接从 NoSQLBooster 连接到 FerretDB确认 FerretDB 容器已经运行后打开 NoSQLBooster点击Connect打开连接窗口选择New Connection填入连接 URImongodb://127.0.0.1:27017/点击OKNoSQLBooster 便会尝试与运行在27017端口的 FerretDB 握手对应服务端的hello/isMaster等握手命令。认证配置在Connection Editor的Authentication标签页中选择LDAP (PLAIN)并填写用户名与密码。这篇博客成文时 FerretDB 只支持 PLAIN 认证机制所以需要在 NoSQLBooster 侧选择该机制。需要说明的是认证能力是随版本演进的当前仓库的官方文档 authentication.md 明确指出客户端侧目前支持SCRAM-SHA-256认证机制。无论哪种机制核心原则一致——FerretDB 自身不存储任何用户名/密码而是完全委托给 PostgreSQL 校验客户端把凭据交给 FerretDBFerretDB 转发给 PostgreSQLPostgreSQL 校验通过后才放行后续查询。你既可以在 PostgreSQL 里用CREATE USER newuser WITH PASSWORD newpassword;创建用户也可以通过 FerretDB 的createUser命令创建该命令在 commands.go 中注册对应msg_createuser.go实现。创建完成后使用mongodb://newuser:newpassword127.0.0.1:27017/这样的 URI 即可完成认证连接。添加演示数据连接成功后NoSQLBooster 会列出 FerretDB 实例中所有可见的数据库。为了演示后续功能我们先通过 NoSQLBooster 内置的 Mongo Shell 向orders集合灌入一批演示数据。点击带 Shell 图标的标签页打开 Mongo Shell执行以下脚本db.orders.insertMany([ { order_id: 1001, customer: John Doe, items: [ { name: shirt, quantity: 2, price: 25.99 }, { name: pants, quantity: 1, price: 34.99 } ], date: new Date(2023-04-25) }, { order_id: 1002, customer: Jane Smith, items: [ { name: dress, quantity: 1, price: 89.99 }, { name: shoes, quantity: 1, price: 49.99 } ], date: new Date(2023-04-26) }, { order_id: 1003, customer: Bob Johnson, items: [{ name: jacket, quantity: 1, price: 69.99 }], date: new Date(2023-04-27) }, { order_id: 1004, customer: Alice Lee, items: [ { name: socks, quantity: 3, price: 9.99 }, { name: hat, quantity: 1, price: 19.99 } ], date: new Date(2023-04-28) }, { order_id: 1005, customer: Tom Wilson, items: [ { name: sweater, quantity: 1, price: 59.99 }, { name: scarf, quantity: 2, price: 29.99 } ], date: new Date(2023-04-29) } ])这 5 条订单文档构成了我们的演示数据集每条订单包含order_id、customer、嵌套数组items以及date字段其中items数组元素又由name、quantity、price组成——正好覆盖了嵌套文档、数组展开、分组聚合等后续练习场景。在 NoSQLBooster 中验证 FerretDB 基础操作插入完成后在数据库树中导航到orders集合如果没看到新集合点击Refresh刷新。双击集合即可打开并读取其中的数据。下面我们用几种不同的操作方式验证 FerretDB 对典型 MongoDB 工作负载的支持。用可视化 Query Builder 查询嵌套文档场景查找items.name等于shoes的订单文档即 Jane Smith 的那条订单。这需要查询嵌套数组字段是文档数据库的典型检索场景。在 NoSQLBooster 中点击Query标签页打开 Query Builder插入查询条件设置items.name等于shoes点击OK and Run执行查询即可看到匹配结果FerretDB 会把这类嵌套字段查询翻译为底层 SQL 执行。从源码结构看find命令在 commands.go 中注册由msg_find.go实现查询过滤逻辑最终落到internal/documentdb层DocumentDB 扩展完成。因此Query Builder 生成的条件只要能表达为 MongoDB 查询文档FerretDB 就能正确处理。使用聚合管道Aggregation PipelineFerretDB 支持在 Mongo Shell 中执行任意支持的命令。我们先统计orders集合中的文档总数db.orders.aggregate([{ $count: total_orders }])返回结果中包含字段total_orders值为5——即集合中的订单总数。再做一个更复杂的变换计算每位客户购买所有商品的总金额。这里需要先把嵌套的items数组展开$unwind再按订单分组求和$group$sumdb.orders.aggregate([ { $unwind: $items }, { $group: { _id: $_id, total_value: { $sum: $items.price } } } ])执行后每个订单会输出一个total_value字段表示该订单所有商品价格之和。从实现上看aggregate命令由 msg_aggregate.go 的msgAggregate处理它先通过会话LSID管理创建/更新会话然后调用后端连接池的Aggregate方法执行管道最后把结果页与游标返回给客户端并将游标登记到会话中h.s.AddCursor。整个流程与 MongoDB 的聚合执行模型对齐。除了aggregate、count、distinct等命令FerretDB 还支持多种聚合管道阶段。参考官方文档 aggregation-stages.md当前文档列出的阶段包括聚合阶段说明$count统计匹配查询的文档数量$group按指定值或表达式分组为每组返回一条文档$limit限制文档数量并把剩余文档传给下一阶段$match类似find只把匹配查询条件的文档传给下一阶段$project指定传给管道下一阶段的文档字段$skip跳过指定n个文档把其余文档传给下一阶段$sort按指定顺序排序并返回全部文档$unset指定要从文档中移除/排除的字段$unwind将数组字段拆解为数组中的每个元素返回一条文档结合文档中提到的$count、$group、$limit、$match、$out、$skip、$sort、$unwind等阶段可以看到 FerretDB 足以支撑与 MongoDB 类似的复杂数据变换场景。更完整的命令支持矩阵可参考迁移/兼容性文档compatibility.md 中的 known differences 与 supported commands 列表。监控与性能分析FerretDB 还允许你在 NoSQLBooster 界面内直接监控和分析运行环境。例如用下面的命令收集orders集合的统计信息db.orders.stats()该命令对应服务端的collStats在 commands.go 中注册为 Returns storage data for a collection.。从 msg_collstats.go 的源码可以看到它支持scale参数来控制返回数值的缩放默认scale 1并返回集合的存储统计信息。此外NoSQLBooster 还提供Visual Explain工具可以把explain命令的输出渲染成树状视图直观展示查询执行计划。explain命令在 FerretDB 侧由 msg_explain.go 实现。该实现会先校验待解释的命令类型仅对aggregate、count、find三种命令生成执行计划aggregate→documentdb_api_catalog.bson_aggregation_pipelinecount→documentdb_api_catalog.bson_aggregation_countfind→documentdb_api_catalog.bson_aggregation_find随后对选中的函数执行EXPLAIN (FORMAT JSON) SELECT document FROM ...把 PostgreSQL 返回的 JSON 执行计划反序列化为 BSON 文档再拼上serverInfo主机、端口、MongoDB 兼容版本号与 FerretDB 版本返回给客户端。NoSQLBooster 拿到这些数据后就能以树状图的形式呈现查询计划帮助你定位慢查询与索引缺失。继续探索FerretDB × MongoDB GUI 生态以上演示只是 FerretDB 与 MongoDB GUI 工具协同工作的一个缩影。FerretDB 保持了对 MongoDB 协议的高兼容性因此同类 GUI如 Studio 3T、mongo-express 等也可按类似流程接入每个新版本都会继续扩充兼容命令与适配应用清单。如果你是开发者想要深入了解实现或参与贡献可以从以下几处入手命令注册表internal/handler/commands.go——查看当前支持的全部命令及帮助文本协议入口internal/clientconn——了解 MongoDB Wire Protocol 如何被接收并路由认证机制website/docs/security/authentication.md——了解 SCRAM-SHA-256、用户创建与关闭认证的配置方式兼容性说明website/docs/migration/compatibility.md——查看已知差异与支持的命令清单安装与快速开始README.md 与 website/docs/installation——涵盖 Docker、二进制包、Kubernetes 等部署方式。实战要点回顾环节关键操作对应服务端命令/源码部署docker compose up -d启动 FerretDB PostgreSQLinternal/clientconn监听 27017连接URImongodb://127.0.0.1:27017/ 认证凭据hello/authenticate见 authentication.md写入Shell 中insertMany灌入演示数据insert见 commands.go查询Query Builder 嵌套字段items.name shoesfind见msg_find.go聚合$count、$unwind$group$sumaggregate见 msg_aggregate.go监控db.orders.stats()、Visual ExplaincollStats/explain见 msg_collstats.go 与 msg_explain.go通过以上流程你可以快速验证 FerretDB 在真实 MongoDB GUI 工作流中的表现——从日常 CRUD、可视化查询到聚合变换与执行计划分析FerretDB 都能以开源的方式提供接近 MongoDB 的开发体验同时让你彻底摆脱对专有数据库的锁定。【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址: https://gitcode.com/gh_mirrors/fe/FerretDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考