ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

FerretDB v1.19.0 发布深度解读:SQLite 嵌套字段索引、SCRAM-SHA-256 认证演进与关键 Bug 修复

FerretDB v1.19.0 发布深度解读:SQLite 嵌套字段索引、SCRAM-SHA-256 认证演进与关键 Bug 修复 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载本篇基于 FerretDB 官方 v1.19.0 发布公告结合当前仓库源码系统讲解该版本的两大主线一是 SQLite 后端新增嵌套字段nested fields索引创建能力二是为SCRAM-SHA-256认证机制铺路而引入的用户管理命令族createUser、dropUser、usersInfo等。同时覆盖getMore的maxTimeMS、upsert$setOnInsert、重复_id索引验证等多项重要 Bug 修复帮助读者在升级到 v1.19.0 时准确评估新能力、规避已知问题并理解 FerretDB 认证体系后续演进的底层脉络。发布概览FerretDB v1.19.0 是 2024 年 1 月发布的里程碑版本核心交付物包括新功能SQLite 后端支持在嵌套字段上创建索引直接提升嵌套文档结构的查询性能Bug 修复修复getMore命令的maxTimeMS处理对 tailable cursor 至关重要、upsert与$setOnInsert组合失效问题、重复创建_id索引时的错误校验逻辑认证演进为未来支持SCRAM-SHA-256机制新增了一批基础用户管理命令并支持通过隐藏 flag 开启实验性认证模式文档更新补充 OpLog 功能的使用文档并修复了文档站搜索无法处理$eq等操作符查询的问题。该版本继续强化 FerretDB 作为真正开源 MongoDB 替代品的两大支柱——兼容性与性能同时为后续用户管理与认证体系的大规模重构打下地基。新功能SQLite 后端支持嵌套字段索引在 v1.19.0 之前SQLite 后端对索引的支持主要停留在顶层字段。本次发布解除了这一限制现在可以对文档中嵌套在对象内部的字段创建索引。使用方式假设你有一个supply集合其中的文档形如{ _id: ObjectId(...), item: { name: widget, qty: 42 } }现在可以直接对嵌套字段item.name创建升序索引db.supply.createIndex({ item.name: 1 })命令执行成功后FerretDB 会在 SQLite 后端为item对象内部的name字段建立升序索引。此后针对嵌套结构发起的查询例如db.supply.find({ item.name: widget })可以利用该索引显著提速尤其适合文档层级较深、嵌套访问频繁的业务场景。源码层面的支撑从命令分发角度看索引创建经由 internal/handler/msg_createindexes.go 中的msgCreateIndexes处理它先校验indexes字段必须存在再通过h.p.WithConn获取后端连接最终调用documentdb_api_internal.CreateIndexesNonConcurrently落库并把后端的错误码如code、errmsg映射为标准的 MongoDB 命令错误。整个调用链说明嵌套字段索引能力是数据库内核层DocumentDB API支持的而非简单的客户端语法糖索引键路径的解析、存储与查询匹配都在后端完成。关键 Bug 修复getMore的maxTimeMS与 tailable cursortailable cursor 依赖getMore长时间挂起以等待新数据因此maxTimeMS的处理直接关系到游标生命周期。v1.19.0 修复了getMore命令中maxTimeMS的解析与校验问题。在 integration/cursor/getmore_test.go 中可以看到针对该修复的大量回归测试例如maxTimeMS传-1、math.MaxInt64、1000.5等非法值时应分别报出out of range或non-integral value错误nil或字符串类型应报maxTimeMS must be a number或类型不匹配错误。这些用例印证了修复后getMore对超时参数做了严格的类型与取值范围校验避免 tailable cursor 场景下出现异常行为。upsert与$setOnInsert组合失效upsert在文档不存在时执行插入此时$setOnInsert指定的字段应当被一并写入。v1.19.0 修复了该组合不生效的问题。对依赖存在则更新、不存在则按模板插入语义的业务如计数聚合、去重写入而言这一修复让findAndModify/update的行为与 MongoDB 原生语义保持一致。重复_id索引验证此前在特定条件下重复创建_id索引会错误地抛出 Index already exists with a different name 错误。v1.19.0 修复了_id索引创建的验证过程使重复创建_id索引成为幂等操作不再误报命名冲突。这对自动化脚本反复执行createIndexes的场景如 CI 初始化、迁移脚本重跑尤为友好。认证体系演进向 SCRAM-SHA-256 迈进v1.19.0 在认证方向上的动作是战略性的FerretDB 团队连续多个版本都在为支持SCRAM-SHA-256机制做准备这是大量潜在用户在生产应用中落地 FerretDB 的硬性诉求。支撑该机制的前提是FerretDB 自行管理用户因此需要补齐完整的用户管理命令。新增用户管理命令v1.19.0 已提供以下命令的基础支持命令作用对应源码createUser创建用户并分配角色internal/handler/msg_createuser.godropUser删除指定用户internal/handler/msg_dropuser.godropAllUsersFromDatabase清空当前库的全部用户internal/handler/msg_dropallusersfromdatabase.goupdateUser更新用户密码与角色internal/handler/msg_updateuser.gousersInfo查询用户信息internal/handler/msg_usersinfo.go从实现看这些命令均遵循同一模式通过h.s.CreateOrUpdateByLSID绑定逻辑会话再用h.p.WithConn获取连接并调用 DocumentDB API如documentdb.CreateUser、documentdb_api.DropUser、documentdb_api.UsersInfo执行实际存储操作。以createUser为例internal/handler/msg_createuser.go 中有两个值得注意的细节若客户端未显式提供rolesFerretDB 会自动附加默认角色clusterAdminreadWriteAnyDatabase均在admin库并输出一条警告日志会先移除mechanisms字段再下发后端相关完整支持仍在演进中见代码中的 TODO 标记。启用方式隐藏测试 flag当前这些用户管理命令仅供测试用途需要通过隐藏 flag 开启# 命令行方式 ferretdb --test-enable-new-auth # 或环境变量方式 FERRETDB_TEST_ENABLE_NEW_AUTHtrue ferretdb该 flag 在 website/versioned_docs/version-v1.24/configuration/flags.md 中登记为Flag说明环境变量默认值--test-enable-new-authEnable new authentication modeFERRETDB_TEST_ENABLE_NEW_AUTHfalse注意v1.19.0 发布时该 flag 属于--test-*隐藏参数不会出现在--help输出中文档中也明确标注不要记录--test-XXXflags。这提醒使用者此模式尚处实验阶段接口可能随版本演进而变化不应直接用于生产环境。完整实操示例开启实验性认证模式后可以用runCommand走一遍完整的用户生命周期ferretdb db.runCommand({ createUser: user, pwd: password, roles: [] }); { ok: 1 } ferretdb db.runCommand({usersInfo:1}) { users: [ { _id: ferretdb.user, user: user, db: ferretdb, roles: [], userId: UUID(26e8c6fa-46b1-4f3f-9754-fbfa7a2bf4b8) } ], ok: 1 } ferretdb db.dropUser(user); { ok: 1 }从输出可以看到用户_id采用库名.用户名的复合命名ferretdb.useruserId为 UUID 二进制类型db字段标识用户归属库——这与 MongoDB 的用户文档模型一致为后续SCRAM-SHA-256认证打好了数据基础。测试用例佐证仓库中的集成测试 integration/auth/create_user_test.go 覆盖了createUser的丰富边界场景空用户名、空密码、密码含\x00与非法 Unicode 字符均被拒绝缺少pwd、roles字段或类型错误时返回对应的 MongoDB 错误码如Location40414、TypeMismatch成功的createUser会写入SCRAM-SHA-256凭据包含iterationCount15000、salt、storedKey、serverKey等字段——这正是 SCRAM 认证所需的完整凭据结构。这进一步印证v1.19.0 已具备以 SCRAM-SHA-256 格式存储用户凭据的能力只待认证链路握手、会话校验贯通后即可对外提供完整认证。文档与生态更新OpLog 使用文档补齐v1.18.0 引入了 OpLog 功能后v1.19.0 继续完善其使用文档说明如何为应用配置 OpLog。有了 OpLog开发者可以用 FerretDB 搭建实时应用——典型代表是基于 Meteor 框架的实时数据同步场景Meteor 依赖 MongoDB oplog 实现 live query。文档站搜索修复此前的文档搜索无法正确处理包含$eq这类操作符的查询——$前缀字符会导致检索失败。v1.19.0 修复了该问题使得开发者可以正常检索以$开头的操作符文档降低了查阅操作符语义的门槛。总结FerretDB v1.19.0 是一次能力补强 地基铺设型发布对 SQLite 用户嵌套字段索引让复杂文档结构的查询性能获得直接提升对游标与写入场景maxTimeMS、upsert$setOnInsert、重复_id索引等修复消除了多项实际兼容性障碍对认证演进用户管理命令族与 SCRAM-SHA-256 凭据存储的落地为后续完整认证机制--test-enable-new-auth从实验走向正式奠定了坚实的数据层与命令层基础。如果你想进一步深入可以阅读 CHANGELOG.md、用户管理命令源码internal/handler 目录下的msg_createuser.go、msg_dropuser.go、msg_usersinfo.go等以及 integration/auth 与 integration/cursor 下的集成测试全面掌握该版本的行为边界。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐FerretDB 认证机制详解基于 PostgreSQL 的 SCRAM-SHA-256 用户认证与配置实战FerretDB 认证机制详解基于 PostgreSQL 的 SCRAM SHA 256 用户认证与配置实战 认证Authentication是数据库安全后端数据库文档数据库FerretDB 认证机制完全指南基于 PostgreSQL 的 SCRAM-SHA-256 用户认证与配置实战FerretDB 认证机制完全指南基于 PostgreSQL 的 SCRAM SHA 256 用户认证与配置实战 FerretDB 是一款真正开源、与 Mon后端数据库文档数据库FerretDB v1.6.0 发布解读SQLite 后端 ping/getParameter、killCursors 游标管理与关键修复FerretDB v1.6.0 发布解读SQLite 后端 ping/getParameter、killCursors 游标管理与关键修复 FerretDB后端数据库文档数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表