范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

Quest商店收入超16亿美元Meta宣布Oculus发行部门Meta日前公布了其VR发布部门的正式名称OculusPublishing。该部门将与工作室合作,提供资金制作和推广服务。Oculus于2014年被此前名为Facebook的MetWOT丨您看得上这些奖励吗?天梯战绯红狮鹫赛季有哪些改动?本文首发于微信公众号坦克零距离,文章转载权限坦克空间站UP为个人专栏文章作者,非官方人员,在头条同步更新文章天梯战绯红狮鹫赛季各位车长老爷们大家好啊,我是阿纳贝尔丶卡多。就在昨天,V社公布CS2限量测试QA问答!你想知道的都在这V社今日正式公布了反恐精英2(CounterStrike2),本作基于起源2引擎开发,将于2023年夏季推出,在CS2正式推出前,V社还会进行邀请制的限量测试,测试现已开始。此外V逆水寒老兵服动动小手指周入100万铜币,最新搬砖攻略!本期给大家带来最新拍卖行搬砖攻略,周入百万铜币不是梦。不需要你装备多好,评分多高,唯一要求有一个满级工匠研究的帮会就行了。不定期给大家分享最新的搬砖,或者游戏攻略,原创不易,喜欢的千年盛世武功攻略千年盛世之原始千年武学介绍一开始,我们仍然正常地完成任务。当我们离开新手村到达城南时,会弹出一个首充礼包。这个首充礼包包含了一把斧头的无击阵技术。这种武术训练成功可以增加12点活力最终幻想16片段引发争议玩家不想再钻洞了!最近由最终幻想16日本官方推特发布的一小段演示视频在玩家中引发了巨大争议。视频展示了玩家角色挤过狭窄的洞穴,而许多玩家都已经对这个在许多游戏中经常见到的设计感到了反感和厌倦。演示视据统计,第一批阳康的人已经出现了16种后遗症,千万别大意!据统计,第一批阳康的人已经出现了16种后遗症,特别是55岁以上的人,千万别大意!1睡不着。很多人都出现了失眠的症状,每天最多只能睡三四个小时。晚上睡不好,白天精神状态不好。有的人甚吃螃蟹过多会不会影响月经螃蟹是一种营养丰富的食品,富含蛋白质钙磷等多种营养物质。对于女性而言,月经是生殖系统健康的一个重要表现,而一些女性可能会担心吃螃蟹过多会对月经产生不良影响。那么,吃螃蟹过多是否会影用好儿童春季生长期春季气温逐渐回暖,对处于生长发育期的儿童来说,是长个子的黄金时期。有研究表明,孩子的生长是有季节性的,在春季往往长得更快。中国疾病预防控制中心营养与健康所研究员刘爱玲表示,春季气温电讯报若曼联在赛季结束前被出售,欧足联将讨论双重所有权问题直播吧3月23日讯据每日电讯报消息,如果格雷泽家族完成了曼联出售事宜,欧足联将加速讨论双重俱乐部所有权的问题。欧足联主席切费林透露,他们正在考虑修改欧战的相关规定,他们将允许拥有相雪游龙再起呼啸声20222023赛季全国雪车雪橇项目各有突破光明日报记者王东加油,加速,冲!国家雪车雪橇中心雪游龙的出发区热闹非凡光滑洁白的赛道人声鼎沸的环境穿着北京冬奥会服装的工作人员疾速奔跑的运动员这熟悉的一幕幕好似又把记者拉回到202
从源头出发,曙光存储力破底层关键技术打好科技仪器设备操作系统和基础软件国产化攻坚战,加强基础研究,从源头和底层解决关键技术问题成为当前科技发展的最高指引。存储作为数据基础设施的底座,只有具备前瞻洞察力,提前部署自研技印尼Tokopedia营销解决方案七亿客资讯在过去几年中,跨境卖家越来越重视电子商务平台作为扩展业务的重要方式。不仅是中小微企业,就连各种大品牌也纷纷入驻在线电子商务平台。在这里,消费者可以获得丰富的产品和服务,因3块钱逛遍全城,嗦粉堪称第一,这座0套路小城,去过的人都真香了近期只要有朋友问去哪玩,骑驴都是强烈安利柳州。在没逃过螺蛳粉的真香定律,尝了第一口螺蛳粉后,就彻底沦陷了!于是为了一口最本地最正宗的粉,果断去柳州了!相信很多朋友都和骑驴一样,螺蛳十年烂尾楼为何能变身遂昌建筑天花板?2021年的3月,总投资9932万元的遂昌县东城新区滨水城市客厅项目正式开工。历时近2年,该项目在今年2月中旬完成验收工作,实现了艺术转型。最近,这份外向的美丽吸引了不少路过的市民三山五岳,你去了几个呢?历史开讲星标古人崇拜自然,山川河流被赋予神力。五岳声名远播,自然成为历代帝王祭祀的对象。中国名山首推五岳,五岳归来不看山。五岳各具特色东岳泰山之雄,西岳华山之险,南岳衡山之秀,北岳名单公示四川拟新增17家4A景区记者2月28日从四川省旅游资源规划开发质量评定委员会获悉,根据旅游景区质量等级的划分与评定和旅游景区质量等级管理办法国家标准,由各市(州)旅资委(景评委)推荐,经四川省旅游资源规划开远油菜花开春意浓来源云南日报春回大地万物复苏,红河哈尼族彝族自治州开远市中和营镇响水村委会羊子旧村一片生机勃勃。田野里,金灿灿黄嫩嫩的油菜花化身花的精灵,亭亭玉立。放眼望去,湛蓝的天空下,油菜花随历史上的3月1日1932年中华民族复兴社成立中华民族复兴社,简称复兴社,是国民党内部带有特务性质的派系组织,于1932年3月1日成立。蒋介石任社长,主要骨干有贺衷寒滕杰康泽桂永清肖赞育戴笠郑介民等英法曾短暂合并,9月婴儿成历史唯一英法两国国王,最终惨死塔中1422年,英法百年战争进行到第85个年头,此时的英王亨利五世携阿金库尔大捷之余威,横扫法兰西,攻陷了大半领土,将整个百年战争推向了最高潮。亨利五世似乎已经看到了法国王座在向他招手家有儿女丨感统失调是怎么回事?点击蓝字关注我们本期推出家有儿女广播节目第3135期欢迎收听家有儿女第三十一期阅读和语文以及语文成绩有什么关系?阅读应该读些什么?又该怎么阅读?一起听听,35年教龄的一线语文名师分计划生育标语应该去除吗作为80后,对计划生育的国策甚为了解。一胎生男孩,不准生二胎。少生不生,幸福一生。那么是什么原因会出此国策呢?人口的飞速增加,对经济发展起到了严重的阻碍。本来连温饱都解决不了的家庭