ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

RxDB MongoDB RxStorage 实战:让 MongoDB 成为本地优先数据库的存储引擎

RxDB MongoDB RxStorage 实战:让 MongoDB 成为本地优先数据库的存储引擎 数据库NoSQL嵌入式数据库实时数据库【免费下载链接】rxdbThe local-first database that runs on every JS runtime and replicates with your existing backend - no vendor, no lock-in - https://rxdb.info/项目地址https://gitcode.com/gh_mirrors/rx/rxdb点击查看免费下载MongoDB RxStorage 是 RxDB 官方提供的一种 RxStorage 实现它允许你使用 MongoDB 作为 RxDB 数据库的底层存储引擎从而同时获得 MongoDB 的成熟生态与可扩展性以及 RxDB 的实时同步能力。读完本文你将掌握 MongoDB RxStorage 的安装接入方式、连接串配置、已知限制与源码级工作原理并了解它如何与 MongoDB 复制插件配合构建完整的实时同步方案。什么是 MongoDB RxStorageRxDB 本身并不是一个自包含的数据库它把数据真正存放的位置抽象为 RxStorage 接口。通过切换不同的 RxStorage 实现RxDB 可以在浏览器、Node.js、React Native 等不同 JavaScript 运行时上使用完全不同的底层存储。MongoDB RxStorage 就是其中的一种服务端实现它通过 MongoDB 官方的 Node.js 驱动mongodb包把 RxDB 的文档、索引、变更事件等全部落地到 MongoDB 中。该存储被设计为可与任何形态的 MongoDB 配合工作普通的 MongoDB Server独立部署MongoDB Replica Set副本集Sharded MongoDB Cluster分片集群Atlas Cloud Database云数据库。这意味着无论你的基础设施是自建机房还是云上托管都可以把 MongoDB 作为 RxDB 的持久化层。需要说明的是由于浏览器和移动端无法直接使用 MongoDB 的 wire protocol 连接副本集MongoDB RxStorage 主要用于 Node.js 服务端场景。当前版本的已知限制在把 MongoDB RxStorage 引入生产环境之前务必先了解它的三条边界与 RxAttachment 等功能的取舍有关多 Node.js 服务器共享同一个 MongoDB 数据库目前不受支持。从源码看实例的变更事件通过进程内的Subject广播见 rx-storage-instance-mongodb.ts 中的changes$跨进程的 MongoDB Change Stream 监听代码在源码中被注释掉并标注为可能的 premium 功能因此多服务器场景下的变更传播无法保证。RxAttachments附件目前不受支持。存储实例的构造函数会对 schema 进行校验一旦检测到schema.attachments存在就直接抛出错误attachments not supported in mongodb storage, make a PR if you need thatgetAttachmentData方法同样直接抛错。不支持在 MongoDB 上做非 RxDB 的写入。RxDB 期望所有写入都经由自身完成并维护所需的元数据如_rev、_deleted、_meta.lwt外部直接写入会破坏 RxDatabase 的一致性导致未定义行为。但你可以随时从外部对 MongoDB 存储执行只读查询这不会影响 RxDB 的正常工作。快速上手把 RxDB 接入 MongoDB使用 MongoDB RxStorage 只需两个步骤。第一步安装 mongodb 驱动包npm install mongodb --savemongodb是 MongoDB 官方的 Node.js 驱动。在本仓库中它被声明为mongodb的依赖项package.json 中为mongodb: ^6.21.0 || ^7.0.0同时也是 RxDB 自身运行 MongoDB 相关测试和脚本时使用的驱动版本。第二步创建 RxDatabase 时启用 MongoDB RxStorageimport { createRxDatabase } from rxdb; import { getRxStorageMongoDB } from rxdb/plugins/storage-mongodb; const myRxDatabase await createRxDatabase({ name: exampledb, storage: getRxStorageMongoDB({ /** * MongoDB connection string * link https://www.mongodb.com/docs/manual/reference/connection-string/ */ connection: mongodb://localhost:27017,localhost:27018,localhost:27019 }) });核心要点getRxStorageMongoDB从rxdb/plugins/storage-mongodb子路径导入该导出在 package.json 的./plugins/storage-mongodb映射中同时提供了require、import两种格式connection参数接收标准的 MongoDB 连接字符串示例中的多主机地址localhost:27017,27018,27019对应一个三节点副本集返回的RxStorageMongoDB实例实现了 RxDB 的RxStorage接口在 rx-storage-mongodb.ts 中可以看到它通过createStorageInstance创建真实的存储实例并在创建前调用ensureRxStorageInstanceParamsAreCorrect校验参数。connection之外的完整设置项定义在 mongodb-types.tsexport type MongoDBDatabaseSettings { connection: MongoDBConnectionString; // 例如 mongodb://localhost:27017 transactionOptions?: TransactionOptions; // 可选MongoDB 驱动的事务选项 };源码级原理MongoDB RxStorage 是如何工作的理解底层实现有助于你在遇到问题时快速定位也能帮助你评估它在生产环境中的行为。文档存储与_id字段替换MongoDB 使用_id作为默认主键且其生成规则与 RxDB 的主键语义不同。为了不冲突当 RxDB schema 的主键字段名为_id时存储层会把它替换为内部字段__id常量MONGO_ID_SUBSTITUTE_FIELDNAME定义于 mongodb-helper.ts。写入时swapRxDocToMongo把_id改名为__id读取时swapMongoToRxDoc再把它还原为_id查询与排序条件也会做同样的转换primarySwapMongoDBQuerySelector、swapToMongoSort。集合命名与索引创建每个 RxDB 存储实例会连接到名为databaseName -v schema.version的数据库例如exampledb-v0集合名即为 collectionName。实例创建时会自动createCollection创建集合把 schema 中的indexes数组展开并为每个索引追加主键索引然后调用createIndexes建立 MongoDB 索引索引名由字段名以|连接而成见getMongoDBIndexName。因此你无需手工维护 MongoDB 侧索引schema 定义即可驱动索引结构。写入与冲突检测由于 MongoDB 不支持跨文档事务源码注释中明确说明RxDB 采用先比较前序版本再更新的策略来保证一致性插入通过findOneAndUpdate配合$setOnInsert与upsert: true实现不存在才插入若文档已存在则产生一个status: 409的RxStorageWriteErrorConflict冲突错误更新通过findOneAndReplace查询条件中同时带上_rev前序修订号只有版本匹配才会替换成功若失败则重新读取当前文档并返回冲突错误。所有写操作通过writeQueue串行排队执行避免并发写互相踩踏详见 rx-storage-instance-mongodb.ts 的bulkWrite实现。这与 RxDB 的修订号revision机制一脉相承确保了在无事务支持的 MongoDB 上也能可靠地检出写冲突。查询、计数与清理查询RxDB 的 Mango 查询会被prepareMongoDBQuery转换为 MongoDB 的 selector 与 sort再依次应用skip、limit、sort最终把结果逐条swapMongoToRxDoc还原为 RxDB 文档格式计数直接使用countDocuments并返回mode: fast清理cleanup通过deleteMany删除_deleted: true且_meta.lwt早于now() - minimumDeletedTime的墓碑文档这是 RxDB 清理机制Cleanup在 MongoDB 上的落地实现。客户端连接管理getMongoDBClient/closeMongoDBClient见 mongodb-helper.ts维护了一个按连接串为 key 的MONGO_CLIENT_CACHE对同一个连接串复用MongoClient实例并以引用计数管理生命周期引用归零后延迟 2 秒再真正关闭连接以便短期复用场景避免反复建连。连接时还会通过driverInfo把驱动标识标记为RxDB及对应版本便于在 MongoDB 侧观察流量来源。与 MongoDB 复制插件的关系MongoDB RxStorage 解决的是数据存在哪而 MongoDB 复制插件解决的是数据如何与其他服务同步。两者可以独立使用也可以组合复制插件基于 MongoDB Change Stream 实现双向实时同步其客户端通过 RxServer 的复制端点与 MongoDB 通信而 MongoDB RxStorage 则适合在 Node.js 服务端把 MongoDB 直接作为 RxDB 的存储引擎。组合使用时你可以让 RxDB 直接读写 MongoDB再借助复制插件把变更分发到其他客户端或系统。测试与本地运行仓库内置了 MongoDB 相关的完整测试与运维脚本见 package.json启动本地 MongoDB 副本集基于 Dockermongo 8.0.4npm run mongodb:start该命令启动三个端口27017/27018/27019并以--replSet rs0模式运行与文档示例中的三主机连接串对应。停止命令为npm run mongodb:stop。连接自检node ./config/mongodb-connection-tester.jsconfig/mongodb-connection-tester.js会等待容器启动、初始化副本集并等待主节点就绪后执行一次插入供 CI 判断数据库是否可用运行测试npm run test:node:mongodb # 以 mongodb 为默认存储运行 Node 端单元测试 npm run test:fast:mongodb # 快速模式测试跳过 init 测试 npm run test:performance:mongodb测试配置位于 test/unit/config.ts其中 MongoDB 存储的测试连接串为mongodb://localhost:27017/?directConnectiontrue并标注了该存储的测试能力矩阵hasPersistence: true、hasMultiInstance: false、hasAttachments: false、hasReplication: true——这与上文列出的限制完全一致也是你评估功能覆盖范围的最直接依据。生产使用建议综合文档与源码接入 MongoDB RxStorage 时有几点值得注意确保 MongoDB 可用性写入依赖findOneAndReplace与 upsert 语义请确保使用的 MongoDB 版本支持这些操作副本集模式下建议在连接串中配置多个节点以提升容错。外部只读、内部独占写让所有写入都经由 RxDB 完成外部系统如需读取数据可直接查询 MongoDB但不要绕过 RxDB 直接修改文档否则会破坏_rev与元数据的一致性。避开不支持的子集当前版本不要使用 attachments schema 字段也不要部署多 Node.js 实例共享同一 MongoDB 数据库这会绕开hasMultiInstance: false的边界。善用 schema 驱动索引索引由 RxDB 在集合创建时自动建立新增查询字段时先在 RxDB schema 的indexes中声明以保证查询性能。MongoDB RxStorage 让本地优先 服务端 MongoDB的架构成为可能客户端获得 RxDB 的响应式查询与离线能力服务端获得 MongoDB 的成熟存储与运维生态。结合上述限制与源码行为你可以据此判断它是否适合你的项目场景。赞分享数据库NoSQL嵌入式数据库实时数据库【免费下载链接】rxdbThe local-first database that runs on every JS runtime and replicates with your existing backend - no vendor, no lock-in - https://rxdb.info/项目地址https://gitcode.com/gh_mirrors/rx/rxdb点击查看免费下载相关推荐RxDB RxStorage 层详解为每种运行环境选择与组合最佳存储引擎RxDB RxStorage 层详解为每种运行环境选择与组合最佳存储引擎 RxStorage 是 RxDB 的存储抽象层它把「数据库内核」与「底层存储引擎」数据库NoSQL嵌入式数据库实时数据库RxDB Expo Filesystem RxStorage 实战指南让 React Native 数据库读写超越 SQLiteRxDB Expo Filesystem RxStorage 实战指南让 React Native 数据库读写超越 SQLite 本文以 RxDB 官方文档数据库NoSQL嵌入式数据库实时数据库F3D如何用极简工具实现专业级3D模型预览的完整指南F3D如何用极简工具实现专业级3D模型预览的完整指南 你是否曾为复杂的3D软件安装包而烦恼是否在寻找一款能快速预览各种格式3D模型的轻量级工具今天我将为你数据库NoSQL嵌入式数据库实时数据库上一篇开源项目推荐Windows Imaging Tools下一篇vCheck-vSphere 终极指南如何自动化监控VMware虚拟化环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表