RxDB(ReactiveDatabase)一个强大的NoSQL数据库
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的RxDB(Reactive Database的缩写)是一个NoSQL数据库,用于 JavaScript 应用程序,如网站、混合应用程序、电子应用程序、渐进式 Web 应用程序和 Node.js。
反应式意味着您不仅可以查询当前状态,还可以订阅所有状态更改,例如查询结果甚至文档的单个字段。这对于基于 UI 的实时应用程序来说非常有用,因为它易于开发并且具有巨大的性能优势。 为了在客户端和服务器之间复制数据,RxDB 提供了用于实时复制的模块,可以使用任何符合CouchDB的端点以及自定义GraphQL端点。 RxDB特征对浏览器、nodejs、electron、cordova、react-native 和所有其他 javascript-runtime 的多平台支持 基于RxJS的响应式数据处理 离线优先让您的应用在用户没有互联网时仍然可以运行 客户端和服务器数据之间的复制 基于模式的json-schema易于学习的标准 Mango-Query与您从 mongoDB 和 mongoose 中了解的完全一样 加密单个数据字段以保护您的用户数据 数据库状态 (json) 的导入/导出,非常适合使用TDD进行编码 多窗口在不同的浏览器窗口或 nodejs 进程之间同步数据 ORM 功能可轻松处理数据代码关系并自定义文档和集合的功能 完整的TypeScript支持以实现快速安全的编码(需要 Typescript v3.8 或更高版本) 快速开始
安装 RxDB 库和 RxJS(如果之前没有安装) npm install rxdb rxjs --save
使用 PouchDB RxStorage创建一个数据库(您也可以使用其他基于LokiJS或Dexie.js的存储)。 import { createRxDatabase } from "rxdb"; import { getRxStoragePouch, addPouchPlugin } from "rxdb/plugins/pouchdb"; addPouchPlugin(require("pouchdb-adapter-idb")); const myDatabase = await createRxDatabase({ name: "heroesdb", storage: getRxStoragePouch("idb") });
为集合创建架构 const mySchema = { title: "human schema", version: 0, primaryKey: "passportId", type: "object", properties: { passportId: { type: "string", maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: "string" }, lastName: { type: "string" }, age: { description: "age in years", type: "integer", // number fields that are used in an index, must have set minium, maximum and multipleOf minimum: 0, maximum: 150, multipleOf: 1 } }, required: ["firstName", "lastName", "passportId"], indexes: ["age"] }
将集合添加到数据库 const myCollections = await myDatabase.addCollections({ humans: { schema: mySchema }, });
插入文档 const myDocument = await myDatabase.humans.insert({ passportId: "foobar", firstName: "Alice", lastName: "Bobby", age: 42 });
订阅文档值 myDocument.lastName$.subscribe(lastName => { console.log("lastName is now " + lastName); });
查询一些文档 const foundDocuments = await myDatabase.humans.find({ selector: { age: { $gt: 21 } } }).exec();
订阅查询结果 myDatabase.humans.find({ selector: { age: { $gt: 21 } } }).$.subscribe(documents => { console.log("query has found " + documents.length + " documents"); });
更新文档 // either via atomicUpdate() await myDocument.atomicUpdate(data => { data.lastName = "Carol"; return data; }); // or via atomicPatch() await myDocument.atomicPatch({ lastName: "Carol" });
删除文档 await myDocument.remove();开发模式
dev-mode 插件为 RxDB 添加了许多检查和验证。这可确保您正确使用 RxDB API,因此在开发模式下使用 RxDB 时应始终使用开发模式插件。 为模式、查询、ORM 方法和文档字段添加验证检查。 添加可读的错误消息。 确保readonlyJavaScript 对象不会意外变异。
重要: : dev-mode 插件会增加你的构建大小并降低性能。它必须始终在开发中使用。你永远不应该在生产中使用它。 import { addRxPlugin } from "rxdb"; import { RxDBDevModePlugin } from "rxdb/plugins/dev-mode"; addRxPlugin(RxDBDevModePlugin);
与 Node.js 一起使用 async function createDb() { if (process.env.NODE_ENV !== "production") { await import("rxdb/plugins/dev-mode").then( module => addRxPlugin(module as any) ); } const db = createRxDatabase( /* ... */ ); }
与 Angular 一起使用 import { isDevMode } from "@angular/core"; async function createDb() { if (isDevMode()){ await import("rxdb/plugins/dev-mode").then( module => addRxPlugin(module as any) ); } const db = createRxDatabase( /* ... */ ); // ... }模式验证
RxDB 有多个插件可用于确保您的文档数据始终与提供的 JSON 模式匹配。
注意:模式验证可能会占用 CPU 资源并增加构建大小。您应该始终在开发模式下使用 scehma 验证插件。对于大多数用例,您不应在生产中使用验证插件。
当您插入或更新 aRxDocument或使用复制插件复制文档数据时,验证模块会执行模式验证。当不使用验证插件时,可以保护任何文档数据,但在保存不符合架构的数据时可能会出现未定义的行为。
证实
lidate插件使用is-my-json-valid进行模式验证。 import { addRxPlugin } from "rxdb"; import { RxDBValidatePlugin } from "rxdb/plugins/validate"; addRxPlugin(RxDBValidatePlugin);
ajv-验证
另一个执行模式验证的验证模块。这个使用ajv作为验证器,速度更快。更好地符合 jsonschema-standard,但也有更大的构建大小。 import { addRxPlugin } from "rxdb"; import { RxDBAjvValidatePlugin } from "rxdb/plugins/ajv-validate"; addRxPlugin(RxDBAjvValidatePlugin);
验证-z-模式
者is-my-json-valid和ajv-validate用于执行内容安全策略中不允许eval()时可能不需要的验证。"unsafe-eval"这个使用z-schema作为验证器,不使用eval. import { addRxPlugin } from "rxdb"; import { RxDBValidateZSchemaPlugin } from "rxdb/plugins/validate-z-schema"; addRxPlugin(RxDBValidateZSchemaPlugin);数据迁移
使用 RxDB,您可以为您的集合提供迁移策略,自动(或随叫随到)将现有数据从旧模式转换为新模式。这可确保客户的数据始终与您的最新代码版本相匹配。
添加迁移插件
要启用数据迁移,您必须添加migration插件。 import { addRxPlugin } from "rxdb"; import { RxDBMigrationPlugin } from "rxdb/plugins/migration"; addRxPlugin(RxDBMigrationPlugin);
提供策略
创建集合后,您必须在架构的版本号大于 时提供 migrationStrategies 0。为此,您必须将一个对象添加到migrationStrategies为每个模式版本分配一个函数的属性中。migrationStrategy 是一个函数,它获取旧文档数据作为参数并返回新的、转换后的文档数据。如果策略返回null,文档将被删除而不是迁移。 myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; } } } });
也可以使用异步策略: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * 2 means, this transforms data from version 1 to version 2 * this returns a promise which resolves with the new document-data */ 2: function(oldDoc){ // in the new schema (version: 2) we defined "senderCountry" as required field (string) // so we must get the country of the message-sender from the server const coordinates = oldDoc.coordinates; return fetch("http://myserver.com/api/countryByCoordinates/"+coordinates+"/") .then(response => { const response = response.json(); oldDoc.senderCountry=response; return oldDoc; }); } } } });
您还可以筛选应迁移的文档: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * this removes all documents older then 2017-02-12 * they will not appear in the new collection */ 2: function(oldDoc){ if(oldDoc.time < 1486940585) return null; else return oldDoc; } } } });
—END—
开源协议:Apache-2.0 license
开源地址:https://github.com/pubkey/rxdb
2023年中国钛白粉产业市场前景及投资研究报告(简版)中商情报网讯钛白粉的化学名称为二氧化钛,被认为是现今世界上性能最好的一种白色颜料。钛白粉呗广泛应用于涂料塑料造纸印刷油墨化纤橡胶化妆品等工业。它的熔点很高,也被用来制造耐火玻璃,釉
售粮窗口期在即收储扩容减缓豆市压力豆农集中售粮窗口期在即,受各库点卸车条件限制,集中排队压车已是常态,以致贸易商陆续出现谨慎心理,豆制品需求减弱将令豆源转化逐渐步入淡季,政策性收储扩容或成为东北豆市的唯一支撑。随着
发放生育补贴应当跳出户籍算大账作者老鹰近日,全国政协委员中国人口与发展研究中心主任贺丹接受媒体采访,就加强完善生育支持政策提出了多项建议,如鼓励男女产假同休,共担家庭责任生育支持政策不要有孩次之分改变地方生育支
中国教育报评论员性教育要立足本土,抓住合适窗口期中国教育报评论员快评,性教育要立足于本土,抓住合适窗口期。性教育是学校教育不可缺少的一部分,全面性教育应利用好幼儿园这一关键窗口期。有代表委员提出,在幼儿园尽快实施全面性教育,研发
马云现身斐济名人的一举一动总是受各种媒体的关注。据国外网友八卦,马云乘私人飞机从澳大利亚到了斐济!据报道,马云之前一直在澳大利亚,在墨尔本和老友相会。后有网友在机场偶遇马云,称欲乘机离开马云来
美方威胁制裁话音刚落,中方郑重表明中俄关系,让俄吃了定心丸俄乌冲突已经持续了一年多的时间,以美国为首的西方集团仍在不断鼓吹冲突。他们先是要求其他国家必须和西方站在一边,共同向俄罗斯施压,随后又威胁中国一旦向俄提供军民两用的关键物资,美国就
从雷军的三条建议案看小米未来发展方向小米手机是深受广大老百姓喜爱的手机品牌,小米的CEO雷军也是一名有着社会责任的优秀企业家。最近,作为2023年全国人大代表,雷军提出了三份建议案,分别关于仿生人形机器人汽车信息安全
昆明动物园春日交响樱乐会三八节奏响昆明信息港讯记者李欣怡为庆祝第113个三八国际妇女节,昆明动物园将于3月8日在中心区樱花广场舞台举行三八妇女节演出活动。为前往踏青的市民游客带来昆明聂耳交响乐团春日交响樱乐会专场演
俄德轨道天文台SpektrRG帮助绘制了近5万个星系团据塔斯社3月7日报道,SpektrRG任务俄罗斯部分研究主任RashidSyunyaev院士告诉塔斯社,通过俄罗斯德国轨道天文台SpektrRG完成的调查,研究人员设法绘制了超过5
快会务电子签到系统,一种更高效的线上签到系统快会务电子签到系统是一种基于互联网技术的签到方式,相较于传统的纸质签到方式,它具有更高的效率和更多的好处。快会务电子签到系统以下是快会务电子签到系统的一些好处提高签到效率使用电子签
我玩三国志11的十四年(二)三11陪我度过了最美好的青春时光,也见证了我十多年人生的起起伏伏,承载了我对这段重要人生阶段的无数回忆。大学里玩三11,毕业求职时玩三11,工作了玩三11,结婚生子了还在玩三11。
既可以做餐椅,又可以做学习椅的神仙椅近两年,各类儿童餐椅产品层出不穷,五花八门材质各异的儿童餐椅让人眼花缭乱。简单来说,儿童餐椅可分为简易餐椅多功能餐椅和成长餐椅。简易餐椅由塑料外壳金属椅架组成,价格便宜,但安全性较
重庆山城夜游持续升温重庆山城夜游持续升温中国青年报客户端3月25日晚,重庆市渝中区洪崖洞景区。当日正值周末,网红景区洪崖洞灯火璀璨,人头攒动,山城夜游持续升温。中青报中青网记者张玉佳摄3月25日晚,重
从一家美到家家美江西萍乡乡村新貌让人喜上眉梢春光明媚,沿着村级公路一路向前,丰富多彩的乡村景观和基础设施,让记者体验了一把一步一景,景景动人的乡村画廊一栋栋乡村民居高雅别致,一条条进村大道宽阔敞亮,道路两旁绿树成荫,河流像飘
皮肤干只能不停的补水吗?很多人肌肤干,只知道补水,不知道锁水,这是不对的。另外,很多人屏障受损,导致肌肤锁水能力变差,水分流失严重,有时候补点水不够跑的1,一般来说,干性皮肤经常伴随着肌肤屏障受损,导致锁
人生低谷时,您的女人会抱怨么?在这个世界上,每个人都会遇到一些坎坷和低谷,而在这些低谷期间,我们希望得到身边人的关爱和支持。然而,也许你身边的某位女性却在这个关键时刻,对你诸多抱怨,让你犹如置身悲观厄运女神的怀
非洲女人们的辫子,可以赤身把自己裹住,还对应着不同身份历史在独立发展中,会出现偶然的相似。老崔说在世界各地,存在许多古老的部落,这些部落保留了他们的古老传统,这些传统代代相传。早在15世纪,头发就是不同部落之间以及社区或部落内婚姻状况
一个女人身上有这些特征,多半是命苦的征兆,余生多悲凉图源自网络侵权请联系删除有人说,1000个人眼里有1000个哈姆雷特。即使是在同一棵树上,也不会长出两片完全一样的叶子。当生命如夕阳西下,女人回望一生,会发现,自己的余生是过的悲凉
西咸新区秦汉新城张裕瑞那城堡酒庄揽获7枚金奖近日,在第32届MUNDUSVINI世界葡萄酒大赛和2023柏林葡萄酒大赛等两项国际赛事中,西咸新区秦汉新城张裕瑞那城堡酒庄揽获7枚金奖。张裕瑞那城堡酒庄除此之外,陕西旅游集团日前
这5种水果的果皮营养价值很高,你却白白扔掉了!你平时吃水果时会削皮吗?很多人会觉得果皮口感不好,或者是担心果皮有农药残留,于是便把果皮去除掉。殊不知这些被丢弃的果皮,其实某些营养物质的含量比果肉还丰富,扔掉相当于扔钱!那么果皮
为什么说聪明人买电动车,不选雅迪爱玛?行内人告诉你4个原因您在阅读前请点击上面的关注二字,后续会为您提供更多有价值的相关内容,感谢您的支持。电动车是上下班代步,日常出行非常方便的交通工具,每年有数千万人买电动车,也有许多人把电动车以旧换新
吃水果不注意这个指标,糖尿病痛风会敲门!一定要知道水果有益健康,但水果吃多了也并不是什么好事。尤其是含糖量较高的水果,如果不小心超量食用,造成糖分摄入过多,不但人会老得更快,免疫力下降等问题也会找上门。尤其是对于痛风和糖尿病患者而