:讓 MongoDB 成為本地優(yōu)先數(shù)據(jù)庫的存儲引擎)
數(shù)據(jù)庫NoSQL嵌入式數(shù)據(jù)庫實時數(shù)據(jù)庫【免費下載鏈接】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 實現(xiàn)它允許你使用 MongoDB 作為 RxDB 數(shù)據(jù)庫的底層存儲引擎從而同時獲得 MongoDB 的成熟生態(tài)與可擴展性以及 RxDB 的實時同步能力。讀完本文你將掌握 MongoDB RxStorage 的安裝接入方式、連接串配置、已知限制與源碼級工作原理并了解它如何與 MongoDB 復(fù)制插件配合構(gòu)建完整的實時同步方案。什么是 MongoDB RxStorageRxDB 本身并不是一個自包含的數(shù)據(jù)庫它把數(shù)據(jù)真正存放的位置抽象為 RxStorage 接口。通過切換不同的 RxStorage 實現(xiàn)RxDB 可以在瀏覽器、Node.js、React Native 等不同 JavaScript 運行時上使用完全不同的底層存儲。MongoDB RxStorage 就是其中的一種服務(wù)端實現(xiàn)它通過 MongoDB 官方的 Node.js 驅(qū)動mongodb包把 RxDB 的文檔、索引、變更事件等全部落地到 MongoDB 中。該存儲被設(shè)計為可與任何形態(tài)的 MongoDB 配合工作普通的 MongoDB Server獨立部署MongoDB Replica Set副本集Sharded MongoDB Cluster分片集群Atlas Cloud Database云數(shù)據(jù)庫。這意味著無論你的基礎(chǔ)設(shè)施是自建機房還是云上托管都可以把 MongoDB 作為 RxDB 的持久化層。需要說明的是由于瀏覽器和移動端無法直接使用 MongoDB 的 wire protocol 連接副本集MongoDB RxStorage 主要用于 Node.js 服務(wù)端場景。當(dāng)前版本的已知限制在把 MongoDB RxStorage 引入生產(chǎn)環(huán)境之前務(wù)必先了解它的三條邊界與 RxAttachment 等功能的取舍有關(guān)多 Node.js 服務(wù)器共享同一個 MongoDB 數(shù)據(jù)庫目前不受支持。從源碼看實例的變更事件通過進程內(nèi)的Subject廣播見 rx-storage-instance-mongodb.ts 中的changes$跨進程的 MongoDB Change Stream 監(jiān)聽代碼在源碼中被注釋掉并標注為可能的 premium 功能因此多服務(wù)器場景下的變更傳播無法保證。RxAttachments附件目前不受支持。存儲實例的構(gòu)造函數(shù)會對 schema 進行校驗一旦檢測到schema.attachments存在就直接拋出錯誤attachments not supported in mongodb storage, make a PR if you need thatgetAttachmentData方法同樣直接拋錯。不支持在 MongoDB 上做非 RxDB 的寫入。RxDB 期望所有寫入都經(jīng)由自身完成并維護所需的元數(shù)據(jù)如_rev、_deleted、_meta.lwt外部直接寫入會破壞 RxDatabase 的一致性導(dǎo)致未定義行為。但你可以隨時從外部對 MongoDB 存儲執(zhí)行只讀查詢這不會影響 RxDB 的正常工作??焖偕鲜职?RxDB 接入 MongoDB使用 MongoDB RxStorage 只需兩個步驟。第一步安裝 mongodb 驅(qū)動包npm install mongodb --savemongodb是 MongoDB 官方的 Node.js 驅(qū)動。在本倉庫中它被聲明為mongodb的依賴項package.json 中為mongodb: ^6.21.0 || ^7.0.0同時也是 RxDB 自身運行 MongoDB 相關(guān)測試和腳本時使用的驅(qū)動版本。第二步創(chuàng)建 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子路徑導(dǎo)入該導(dǎo)出在 package.json 的./plugins/storage-mongodb映射中同時提供了require、import兩種格式connection參數(shù)接收標準的 MongoDB 連接字符串示例中的多主機地址localhost:27017,27018,27019對應(yīng)一個三節(jié)點副本集返回的RxStorageMongoDB實例實現(xiàn)了 RxDB 的RxStorage接口在 rx-storage-mongodb.ts 中可以看到它通過createStorageInstance創(chuàng)建真實的存儲實例并在創(chuàng)建前調(diào)用ensureRxStorageInstanceParamsAreCorrect校驗參數(shù)。connection之外的完整設(shè)置項定義在 mongodb-types.tsexport type MongoDBDatabaseSettings { connection: MongoDBConnectionString; // 例如 mongodb://localhost:27017 transactionOptions?: TransactionOptions; // 可選MongoDB 驅(qū)動的事務(wù)選項 };源碼級原理MongoDB RxStorage 是如何工作的理解底層實現(xiàn)有助于你在遇到問題時快速定位也能幫助你評估它在生產(chǎn)環(huán)境中的行為。文檔存儲與_id字段替換MongoDB 使用_id作為默認主鍵且其生成規(guī)則與 RxDB 的主鍵語義不同。為了不沖突當(dāng) RxDB schema 的主鍵字段名為_id時存儲層會把它替換為內(nèi)部字段__id常量MONGO_ID_SUBSTITUTE_FIELDNAME定義于 mongodb-helper.ts。寫入時swapRxDocToMongo把_id改名為__id讀取時swapMongoToRxDoc再把它還原為_id查詢與排序條件也會做同樣的轉(zhuǎn)換primarySwapMongoDBQuerySelector、swapToMongoSort。集合命名與索引創(chuàng)建每個 RxDB 存儲實例會連接到名為databaseName -v schema.version的數(shù)據(jù)庫例如exampledb-v0集合名即為 collectionName。實例創(chuàng)建時會自動createCollection創(chuàng)建集合把 schema 中的indexes數(shù)組展開并為每個索引追加主鍵索引然后調(diào)用createIndexes建立 MongoDB 索引索引名由字段名以|連接而成見getMongoDBIndexName。因此你無需手工維護 MongoDB 側(cè)索引schema 定義即可驅(qū)動索引結(jié)構(gòu)。寫入與沖突檢測由于 MongoDB 不支持跨文檔事務(wù)源碼注釋中明確說明RxDB 采用先比較前序版本再更新的策略來保證一致性插入通過findOneAndUpdate配合$setOnInsert與upsert: true實現(xiàn)不存在才插入若文檔已存在則產(chǎn)生一個status: 409的RxStorageWriteErrorConflict沖突錯誤更新通過findOneAndReplace查詢條件中同時帶上_rev前序修訂號只有版本匹配才會替換成功若失敗則重新讀取當(dāng)前文檔并返回沖突錯誤。所有寫操作通過writeQueue串行排隊執(zhí)行避免并發(fā)寫互相踩踏詳見 rx-storage-instance-mongodb.ts 的bulkWrite實現(xiàn)。這與 RxDB 的修訂號revision機制一脈相承確保了在無事務(wù)支持的 MongoDB 上也能可靠地檢出寫沖突。查詢、計數(shù)與清理查詢RxDB 的 Mango 查詢會被prepareMongoDBQuery轉(zhuǎn)換為 MongoDB 的 selector 與 sort再依次應(yīng)用skip、limit、sort最終把結(jié)果逐條swapMongoToRxDoc還原為 RxDB 文檔格式計數(shù)直接使用countDocuments并返回mode: fast清理cleanup通過deleteMany刪除_deleted: true且_meta.lwt早于now() - minimumDeletedTime的墓碑文檔這是 RxDB 清理機制Cleanup在 MongoDB 上的落地實現(xiàn)??蛻舳诉B接管理getMongoDBClient/closeMongoDBClient見 mongodb-helper.ts維護了一個按連接串為 key 的MONGO_CLIENT_CACHE對同一個連接串復(fù)用MongoClient實例并以引用計數(shù)管理生命周期引用歸零后延遲 2 秒再真正關(guān)閉連接以便短期復(fù)用場景避免反復(fù)建連。連接時還會通過driverInfo把驅(qū)動標識標記為RxDB及對應(yīng)版本便于在 MongoDB 側(cè)觀察流量來源。與 MongoDB 復(fù)制插件的關(guān)系MongoDB RxStorage 解決的是數(shù)據(jù)存在哪而 MongoDB 復(fù)制插件解決的是數(shù)據(jù)如何與其他服務(wù)同步。兩者可以獨立使用也可以組合復(fù)制插件基于 MongoDB Change Stream 實現(xiàn)雙向?qū)崟r同步其客戶端通過 RxServer 的復(fù)制端點與 MongoDB 通信而 MongoDB RxStorage 則適合在 Node.js 服務(wù)端把 MongoDB 直接作為 RxDB 的存儲引擎。組合使用時你可以讓 RxDB 直接讀寫 MongoDB再借助復(fù)制插件把變更分發(fā)到其他客戶端或系統(tǒng)。測試與本地運行倉庫內(nèi)置了 MongoDB 相關(guān)的完整測試與運維腳本見 package.json啟動本地 MongoDB 副本集基于 Dockermongo 8.0.4npm run mongodb:start該命令啟動三個端口27017/27018/27019并以--replSet rs0模式運行與文檔示例中的三主機連接串對應(yīng)。停止命令為npm run mongodb:stop。連接自檢node ./config/mongodb-connection-tester.jsconfig/mongodb-connection-tester.js會等待容器啟動、初始化副本集并等待主節(jié)點就緒后執(zhí)行一次插入供 CI 判斷數(shù)據(jù)庫是否可用運行測試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——這與上文列出的限制完全一致也是你評估功能覆蓋范圍的最直接依據(jù)。生產(chǎn)使用建議綜合文檔與源碼接入 MongoDB RxStorage 時有幾點值得注意確保 MongoDB 可用性寫入依賴findOneAndReplace與 upsert 語義請確保使用的 MongoDB 版本支持這些操作副本集模式下建議在連接串中配置多個節(jié)點以提升容錯。外部只讀、內(nèi)部獨占寫讓所有寫入都經(jīng)由 RxDB 完成外部系統(tǒng)如需讀取數(shù)據(jù)可直接查詢 MongoDB但不要繞過 RxDB 直接修改文檔否則會破壞_rev與元數(shù)據(jù)的一致性。避開不支持的子集當(dāng)前版本不要使用 attachments schema 字段也不要部署多 Node.js 實例共享同一 MongoDB 數(shù)據(jù)庫這會繞開hasMultiInstance: false的邊界。善用 schema 驅(qū)動索引索引由 RxDB 在集合創(chuàng)建時自動建立新增查詢字段時先在 RxDB schema 的indexes中聲明以保證查詢性能。MongoDB RxStorage 讓本地優(yōu)先 服務(wù)端 MongoDB的架構(gòu)成為可能客戶端獲得 RxDB 的響應(yīng)式查詢與離線能力服務(wù)端獲得 MongoDB 的成熟存儲與運維生態(tài)。結(jié)合上述限制與源碼行為你可以據(jù)此判斷它是否適合你的項目場景。贊分享數(shù)據(jù)庫NoSQL嵌入式數(shù)據(jù)庫實時數(shù)據(jù)庫【免費下載鏈接】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點擊查看免費下載相關(guān)推薦RxDB RxStorage 層詳解為每種運行環(huán)境選擇與組合最佳存儲引擎RxDB RxStorage 層詳解為每種運行環(huán)境選擇與組合最佳存儲引擎 RxStorage 是 RxDB 的存儲抽象層它把「數(shù)據(jù)庫內(nèi)核」與「底層存儲引擎」數(shù)據(jù)庫NoSQL嵌入式數(shù)據(jù)庫實時數(shù)據(jù)庫RxDB Expo Filesystem RxStorage 實戰(zhàn)指南讓 React Native 數(shù)據(jù)庫讀寫超越 SQLiteRxDB Expo Filesystem RxStorage 實戰(zhàn)指南讓 React Native 數(shù)據(jù)庫讀寫超越 SQLite 本文以 RxDB 官方文檔數(shù)據(jù)庫NoSQL嵌入式數(shù)據(jù)庫實時數(shù)據(jù)庫F3D如何用極簡工具實現(xiàn)專業(yè)級3D模型預(yù)覽的完整指南F3D如何用極簡工具實現(xiàn)專業(yè)級3D模型預(yù)覽的完整指南 你是否曾為復(fù)雜的3D軟件安裝包而煩惱是否在尋找一款能快速預(yù)覽各種格式3D模型的輕量級工具今天我將為你數(shù)據(jù)庫NoSQL嵌入式數(shù)據(jù)庫實時數(shù)據(jù)庫上一篇開源項目推薦Windows Imaging Tools下一篇vCheck-vSphere 終極指南如何自動化監(jiān)控VMware虛擬化環(huán)境創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考