RxDB-PouchDB之上的实时数据库

2020-09-01 21:56:58

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

RxDB(反应性数据库的缩写)是一个用于网站、混合应用、电子应用、渐进式Web应用和NodeJS等JavaScript应用的NoSQL数据库。反应式意味着您不仅可以查询当前状态,还可以订阅所有状态更改,如查询结果,甚至文档的单个字段。这对于基于UI的实时应用程序来说是很棒的,因为它使得开发变得容易,并且具有很大的性能优势。为了在客户端和服务器之间复制数据,RxDB提供了与任何CouchDB兼容的端点以及自定义GraphQL端点进行实时复制的模块。

客户端和服务器之间的复制-数据,兼容PouchDB、CouchDB和IBM Cloudant。还有一个用于GraphQL复制的插件。

我们对RxDB进行了优化、复查并制作了样板,这样您就可以直接开始将RxDB用于像这样的框架。

从';rxdb';;const db=await createRxDatabase({name:';heremesdb';,Adapter:';IndexedDB';,密码:';myLongAndStupidPassword';//可选});//创建数据库等待db导入{createRxDatabase}。Collection({name:';heros';,schema:mySchema});//创建集合数据库。英雄们。Insert({name:';Bob';});//插入文档。

分贝。英雄们。Find()。排序(';名称';)。$//<;-返回查询的可观测性。订阅(docs=>;{myDomElement.。InnerHTML=docs。MAP(doc=>;&39;<;li>;';+doc.。名称+&39;<;/li>;';)。Join();});

Const mySchema={标题:";英雄模式";,版本:0,//<;-增量版本号描述:";描述一个简单的英雄";,类型:";对象";,属性:{名称:{类型:";字符串";,主要:TRUE//<;-这意味着:唯一,必需,字符串,并将用作';_id';},密码:{type:";string";,},技能:{type:";array";,maxItems:5,Unique eItems:true,Item:{type:";Object";,属性:{名称:{type:";String";},损坏:{type:";number";},必填:[";color";],加密:[";secret";]//<;-表示该字段的值是加密存储的};

{";标题";:";我的架构";,";属性";:{";机密";:{";类型";:";字符串";,";加密";:true}},";加密";:[";机密";]}。

//这需要IndexedDB适配器RxDB。Plugin(Required(';pouchdb-Adapter-idb';));//这将创建一个包含IndexedDB-Adapter常量数据库=await RxDB的数据库。创建({name:';mydatabase';,Adapter:';IndexedDB';//您的适配器名称});

//导出单个集合const jsonCol=await myCollection。Dump();//导出整个数据库const jsonDB=await myDatabase。Dump();//将转储导入集合等待EmptyCollection。Import Dump(Json);//将转储导入数据库等待EmptyDatabase。Import Dump(Json);

MyRxDatabase。WaitForLeadship()。则(()=>;{//这将仅在实例成为先导时运行。MySocket=createWebSocket();});

//当您使用大键保存对象时,请等待myCollection。INSERT({firstName:';foo';lastName:';bar';dustidLongKey:5});//密钥压缩会在内部将其转换为{';|a';:';foo';';|b';:';bar';';|c';:5}//所以压缩版本只有28个字符,而不是46个字符//压缩在内部工作,所以您当然仍然可以通过原始的key.name访问值并运行普通查询。控制台。日志(myDoc.。名字);//';foo';

假设您有一个非常大的集合,其中包含许多用户文档。在您的页面上,您希望显示一个包含积分最多且当前已登录的用户的拓扑列表。您可以创建一个查询并订阅它。

Const query=usersCollection。Find()。其中(';登录';)。EQ(真)。排序(';点';);查询。$。订阅(用户=&>;{文档。QuerySelector(';Body';)。InnerHTML=用户。Reduce((prev,cur)=>;prev+cur.。用户名+';<;br/>;';,';';);});

正如您可能发现的那样,查询可能需要很长时间才能运行,因为您的集合中有数千个用户。当用户现在注销时,整个查询将在数据库中重新运行,这也需要很长时间。

但是不能使用EventReduce.Now,当一个用户注销时,它将根据当前结果加上RxChangeEvent计算新结果。这通常可以在内存中完成,而无需向存储引擎发出IO请求。EventReduce不仅适用于订阅的查询,而且当您对同一查询执行多个.exec()';时也是如此。