html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?

本回答中使用的术语“复合查询”是指在其WHERE子句中涉及多个条件的SQL SELECT语句。虽然indexedDB规范中没有提到这样的查询,但您可以通过创建一个包含一组属性名称的keypath的索引来近似复合查询的行为。

这与创建索引时使用多条目标志完全无关。多条目标志调整indexedDB如何在单个数组属性上创建索引。我们正在索引对象属性数组,而不是对象的单个数组属性的值。

创建索引

在此示例中,’name’,’gender’和’age’对应于存储在学生对象存储中的学生对象的属性名称。

// An example student object in the students store

var foo = {

'name': 'bar',

'age': 15,

'gender': 'M'

};

function myOnUpgradeNeeded(event) {

var db = event.target.result;

var students = db.createObjectStore('students');

var name = 'males25';

var keyPath = ['name', 'gender', 'age'];

students.createIndex(name, keyPath);

}

在索引上打开一个光标

然后可以在索引上打开一个光标:

var students = transaction.objectStore('students');

var index = students.index('males25');

var lowerBound = ['AAAAA','male',26];

var upperBound = ['ZZZZZ','male',200];

var range = IDBKeyRange.bound(lowerBound, upperBound);

var request = index.openCursor(range);

然而,由于我要解释的原因,这并不总是奏效。

另外:使用rangeCursor或get的range参数是可选的。如果不指定范围,则IDBKeyRange.only将被隐式使用。换句话说,您只需要为有界游标使用IDBKeyRange。

基本指标概念

指数就像对象商店,但不是直接可变的。而是在引用的对象存储上使用CRUD(创建读取更新删除)操作,然后,indexedDB会自动将更新级联到索引。

了解排序是理解指标的基础。索引基本上只是一个特别排序的对象集合。在技​​术上,它也被过滤,但我会在一会儿触及。通常,当您在索引上打开游标时,您将根据索引的顺序进行迭代。此顺序可能并且可能与引用对象存储中的对象的顺序不同。该顺序很重要,因为这样可以使迭代更有效率,并允许自定义的下限和上限在索引特定顺序的上下文中是有意义的。

索引中的对象在商店发生更改时排序。将对象添加到商店时,将其添加到索引中的正确位置。排序归结为一个比较函数,类似于Array.prototype.sort,它比较两个项目,并返回一个对象是否小于另一个,大于另一个对象或相等。因此,我们可以通过深入了解比较功能的更多细节来更好地理解排序行为。

字符串按字典顺序比较

这意味着,例如,’Z’小于’a’,字符串’10’大于字符串’020’。

使用规范定义的顺序比较不同类型的值

例如,该规范指定字符串类型值在日期类型值之前或之后。值不包含什么,只是类型。

IndexedDB不会为您强制类型。你可以在脚下射击自己。你通常不想比较不同的类型。

具有未定义属性的对象不会出现在其关键字由一个或多个这些属性组成的索引中

正如我所提到的,索引可能并不总是包括引用对象存储中的所有对象。将对象放入对象存储中时,如果索引所基于的属性缺少值,则对象将不会出现在索引中。例如,如果我们有一个我们不知道年龄的学生,并且我们将它插入学生商店,那么特定的学生不会出现在男性25的索引中。

记住这一点,当你想知道为什么在索引上迭代游标时不会出现一个对象。

还要注意null和空字符串之间的细微差别。空字符串不是缺少的值。具有空字符串的属性的对象仍然可以基于该属性出现在索引中,但如果属性存在但未定义或不存在,则该索引中不会出现该索引。如果它不在索引中,则在索引上迭代游标时,不会看到它。

创建IDBKeyRange时,必须指定数组keypath的每个属性

创建一个下限或上限时,必须为数组关键字中的每个属性指定一个有效值,以便在该范围上打开光标时在范围内使用。否则,您会收到一些类型的Javascript错误(因浏览器而异)。例如,您不能创建一个范围,例如IDBKeyRange.only([undefined,’male’,25]),因为name属性未定义。

令人困惑的是,如果你指定错误类型的值,例如IDBKeyRange.only([‘male’,25]),其中name是未定义的,你不会在上面的意义上得到错误,但是你会得到无意义的结果。

这个一般规则有一个例外:您可以比较不同长度的数组。因此,从技术上讲,您可以从范围中省略属性,前提是您从数组的末尾执行此操作,并适当地截断数组。例如,您可以使用IDBKeyRange.only([‘josh’,’male’])。

短路数组排序

将Array类型的值与Array的其他值进行比较,如下所示:

>令A为第一个数组值,B为第二个数组值。

>把长度作为A长度和B长度的较小者。

让我成为0。

>如果A的第i个值小于B的第i个值,则A较少

比B.跳过剩下的步骤。

>如果A的第i个值大于B的第i个值,则A大于B.跳过其余步骤。

>增加我1。

>如果我不等于长度,请返回到步骤4.否则继续下一步。

>如果A的长度小于B的长度,则A小于B.如果A的长度大于B的长度,则A大于B.否则A和B相等。

捕获在步骤4和5:跳过剩余的步骤。这基本上意味着如果我们比较两个数组用于顺序,例如[1,’Z’]和[0,’A’],则该方法仅考虑第一个元素,因为在该点1是>由于短路评估(规格中的步骤4和5),它永远不会检查Z对A。

所以,早期的例子是不会奏效的。它实际上更像如下:

WHERE (students.name >= 'AAAAA' && students.name <= 'ZZZZZ') ||

(students.name >= 'AAAAA' && students.name <= 'ZZZZZ' &&

students.gender >= 'male' && students.gender <= 'male') ||

(students.name >= 'AAAAA' && students.name <= 'ZZZZZ' &&

students.gender >= 'male' && students.gender <= 'male' &&

students.age >= 26 && students.age <= 200)

如果您在SQL或通用编程中有这样的布尔子句的任何经验,那么您已经应该认识到整套条件不一定涉及。这意味着您将无法获取所需的对象列表,这就是为什么您无法真正获得与SQL复合查询相同的行为。

处理短路

在当前的实现中,您不能轻易避免这种短路行为。在最坏的情况下,您必须将存储/索引中的所有对象加载到内存中,然后使用自己的自定义排序功能对集合进行排序。

有办法尽量减少或避免一些短路问题:

例如,如果您使用的是index.get(array)或index.openCursor(array),那么就没有任何短路问题。整场比赛还是整场比赛。在这种情况下,比较功能只是评估两个值是否相同,而不是一个是大于还是小于另一个。

其他技术要考虑:

>将关键字的元素从最窄到最大重新排列。基本上提供早期的夹具,可以切断一些不需要的短路结果。

>将包装的对象存储在使用特殊定制属性的商店中,以便可以使用非数组关键字(非复合索引)对其进行排序,或者可以使用不受短组合索引影响的复合索引,电路行为。

>使用多个索引。这导致了exploding index problem.注意这个链接是关于另一个no-sql数据库,但是相同的概念和解释适用于indexedDB,并且链接是一个合理(冗长和复杂的)解释,所以我不在这里重复。

> indexedDB(规范和Chrome实现)的创建者之一最近建议使用cursor.continue:https://gist.github.com/inexorabletash/704e9688f99ac12dd336

使用indexedDB.cmp进行测试

cmp function提供了一种快速简单的方法来检查排序是如何工作的。例如:

var a = ['Hello',1];

var b = ['World',2];

alert(indexedDB.cmp(a,b));

indexedDB.cmp函数的一个不错的属性是它的签名与Array.prototype.filter和Array.prototype.sort的函数参数相同。您可以轻松地从控制台测试值,而无需处理连接/ schemas /索引和所有这些。此外,indexedDB.cmp是同步的,所以您的测试代码不需要涉及async回调/承诺。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark源码分析 -- SchedulableBuilder

SchedulableBuilder就是对Scheduleable tree的封装, 在Pool层面(中间节点), 完成对TaskSet的调度(FIFO, FAIR) 在TaskSetManager 层面(叶子节点), 完成对TaskSet中task的调度(locality)以及track(retry) TaskSetManager 用于封装TaskSet, 主要提供对单个TaskSet内部的tasks的t…

html设置照片模糊效果,CSS如何实现照片模糊?

在开发网页时&#xff0c;照片模糊处理会经常被使用&#xff0c;比如当我们背景图的模糊&#xff0c;当我们不想背景图片过于突出影响美观时&#xff0c;就可以设置将照片模糊处理&#xff0c;突出文字部分。那么 CSS 如何实现照片模糊呢&#xff1f;这篇文章 w3cschool 小编告…

rhel6用centos163 yum源

cd /etc/yum.repos.d/wget wget http://mirrors.163.com/.help/CentOS6-Base-163.reposed -i "s/\$releasever/6/" CentOS6-Base-163.repo 转载于:https://www.cnblogs.com/yanghuahui/p/3507313.html

女生学计算机未来出路,计算机真的已经烂大街了吗,女生学计算机没出路吗?...

假的。先说第一个问题&#xff1a;情况是&#xff0c;现在程序员是很多&#xff0c;但多半是中低端程序员&#xff0c;高端程序员供不应求&#xff0c;薪资一涨再涨。现在的程序员门槛一高再高&#xff0c;就是为了淘汰掉那些半吊子的程序员。如果你是靠从网上复制粘贴代码的“…

简明易懂的call apply

在iteye看到一篇对call解释得相当简明易懂&#xff0c;觉得得宣传一下 &#xff1a; http://uule.iteye.com/blog/1158829 一、方法的定义 call方法: 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一…

计算机网络有哪些技能知识,网络基础知识及操作技能.ppt

网络基础知识及操作技能 主讲人 李春报 一、计算机网络概述 1、计算机网络的概念 计算机网络是把分布在不同地理位置上的计算机、终端&#xff0c;用通信设备和通信线路连结起来&#xff0c;再配以相应的网络软件&#xff0c;从而使众多计算机可以方便地互相传递信息&#xff0…

这些快捷键要学会使用啊

史上最全苹果键盘及Xcode快捷键整理 它们分别是command、option、control、shift以及esc除了command键上有标志之外其余四个可以通过这四个键对比比较出来。 谢谢原文作者提供较详细的快捷键说明。 常用的Xcode快捷键&#xff0c;工欲善其事&#xff0c;必先利其器。mac的键盘和…

目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)

以下是关于2019年4月上海自考《计算机应用基础》串讲复习&#xff0c;由上海自考通整理发布&#xff0c;希望对即将参加自考的考生们能有帮助&#xff0c;更多的复习资料可点击查看历年真题。第一章一、选择1. 世界第一台电子计算机生产日期是( A )。A. 1946 B. 1945 C. 1947 D…

CSS元素选择器

1、在css元素选择器中飞&#xff0c;最重要的是HTML页面中的元素的定位&#xff1b; p { color: red; } h1{ color:blue; font-family:sans-serif; } 2、css选择器分组: 将 h2 和 p 选择器放在规则左边&#xff0c;然后用逗号分隔&#xff0c;就定义了一个规则。其右边的样式&a…

计算机基础知识二进制转换,计算机基础知识数制转换

二、数制转换1.十进制数到二进制数的转换(1)、整数部分 除2取余法(余数为0为止)&#xff0c;最后将所取余数按逆序排列。实例:将十进制数23转换为二进制数2| 232| 11 余数 12| 5 余数 12| 2余数 12|1 余数 00 余数 1结果为 (23)10 (10111)2(2)、小数部分 乘2取整法…

iOS基础 - 控制器

一、当两个控制器互为父子关系的时候&#xff0c;它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上&#xff0c;就应该让A控制器成为B控制器的子控制器&#xff0c;而B控制器就称为A控制器的父控制器 //[B addChildViewController:A]; // A就会存在于…

计算机专业英语第07章,计算机专业英语电子教案第07章.ppt

计算机专业英语电子教案第07章Computer English Chapter 7 Programming Languages 复杂定语(从句)的翻译技巧之二 四、句子结构调整法 有时&#xff0c;原文句中一个中心词带有若干修饰成分&#xff0c;但它们既不是纯“并列”头系&#xff0c;也不是规则的“连环”关系&#x…

关机计算机专业,电脑关机后自动重启怎么回事

日常生活中&#xff0c;大部分的网友朋友们都碰到过电脑在正常使用时&#xff0c;突然电脑自动重启了&#xff0c;并且多次尝试强制关机都无效&#xff0c;令人费神。下面小编针对此问题的原因给出了几种方法&#xff0c;希望对大家有所帮助&#xff0c;快来看看吧&#xff01;…

PHP验证码常用的函数记录

1、绘制真彩画布&#xff0c;返回资源类型的图像标识符 resource imagecreatetruecolor ( int $width , int $height ) 例&#xff1a;$image imagecreatetruecolor( 30, 20 ); 2、为创建的画布分配背景颜色&#xff0c;参数中的颜色&#xff08;分别是红绿蓝&#xff09;&…

计算机无法打开打印机ip端口,讲述Win10电脑上无法选择打印机端口的解决方法...

我们在Win10电脑上使用打印机&#xff0c;进行打印材料是很平常的一件事&#xff0c;但是有用户在Win10电脑上&#xff0c;操作打印机时&#xff0c;出现了打印机端口无法选择的问题&#xff0c;不知道该怎么办&#xff1f;如果打印机端口无法正常选择的话&#xff0c;就代表我…

简单自定义标签步骤

自定义标签主要用于移除Jsp页面中的java代码。 使用自定义标签移除jsp页面中的java代码&#xff0c;只需要完成以下两个步骤&#xff1a;编写一个实现Tag接口的Java类(标签处理器类)。编写标签库描述符&#xff08;tld&#xff09;文件&#xff0c;在tld文件中对标签处理器类进…

计算机相关科幻小说,科幻小说家和计算机科学家总是用人工智能来迷惑我们,计算机可以...

科幻小说家和计算机科学家总是用人工智能来迷惑我们&#xff0c;计算机可以自我思考。相关句子1、从更广泛的意义上看&#xff0c;借助计算机科学&#xff0c;我们可以了解人类思想的本质和理性的意义&#xff0c;学会回答如何度过一生这个最古老的问题。把认知视为一种解决周围…

Android 4 学习(20):ActionBar

参考《Pro Android 4.0》 ActionBar 11.0之后&#xff0c;ActionBar在Activity中默认存在&#xff0c;可以在代码中设置其显示与否&#xff1a; ActionBar actionBar getActionBar(); // Hide the Action Bar actionBar.hide(); // Show the Action Bar actionBar.show(); …

计算机WIN7动态硬盘分区,win7硬盘分区教程

win7硬盘分区教程硬盘分区其实是对硬盘的一种格式化&#xff0c;进行了此步骤后才可以使用硬盘保存各种数据&#xff0c;下面是小编为大家详细介绍win7硬盘分区教程&#xff0c;欢迎大家阅读&#xff01;一、进入磁盘管理工具我们点击要对硬盘进行分区&#xff0c;我们首先得知…

一个经典的对象级别插件的开发

先新建一个js&#xff0c;名为jquery.lifocuscolor.js&#xff0c;编写一下代码&#xff1a; (function($) { $.fn.extend({ "focusColor": function(li_col) { var def_col "#ccc"; //默认获取焦点的色值 var lst_col "#fff"; //默认丢失焦点…