IndexedDB -布尔索引

ckocjqey  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(4)|浏览(180)

是否可以在Boolean类型字段上创建索引?
假设要存储的记录的模式为:

{
  id:1,
  name:"Kris",
  _dirty:true
}

我创建了普通的非唯一索引(onupgradeneeded):

...
store.createIndex("dirty","_dirty",{ unique: false })
...

索引已创建,但为空!-在索引IndexedDB浏览器中,不存在具有Boolean值的记录-只有StringNumbersDates或甚至Arrays
我使用的是Chrome 25金丝雀
我想查找_dirty属性设置为true的所有记录-那么我是否必须将_dirty修改为string或int?

uubf1zoe

uubf1zoe1#

是,布尔值不是有效键。
如果必须,当然可以解析为1和0。
但这是有充分理由的。索引布尔值没有提供信息。在上面的例子中,您可以进行表扫描和过滤,而不是索引查询。

cedebl8k

cedebl8k2#

标记为选中的答案不完全正确。
您不能在包含Boolean JavaScript类型值的属性上创建索引。另一个答案的这一部分是正确的。如果您有类似var obj = {isActive: true};的对象,则尝试在obj.isActive上创建索引将不起作用,浏览器将报告错误消息。
但是,您可以轻松地模拟所需的结果。indexedDB不会将对象中不存在的属性插入到索引中。因此,您可以定义一个属性来表示true,而不定义该属性来表示false。当该属性存在时,该对象将出现在索引中。当该属性不存在时,该对象将不会出现在索引中。

示例

例如,假设您有一个'obj'对象的对象存放区。假设您想要在这些对象的isActive属性上建立类似布林的索引。
首先在isActive属性上创建一个索引。
要表示对象的“true”,只需使用obj.isActive = 1;。然后将对象添加或放入对象存储区。如果要查询设置了isActive的所有对象,只需使用db.transaction('store').index('isActive').openCursor();
要表示false,只需使用delete obj.isActive;,然后添加或或将对象放入对象存储区。
当您查询设定了isActive的所有对象时,这些遗失isActive属性(因为它已被删除或从未设定)的对象在使用数据指标反覆运算时将不会出现。
瞧,一个 * 布尔 * 索引。

性能说明

在索引上打开一个游标,就像在这里使用的示例中所做的那样,将提供良好的性能。对于小数据,性能上的差异并不明显,但当存储大量对象时,它就非常明显了。没有必要采用第三方库来实现“布尔索引”。这是一个平凡而简单的特性,你可以自己完成。您应该尽可能地尝试使用本机功能。

9wbgstp7

9wbgstp73#

布尔值属性描述了独占状态(活动/非活动)、“开/关”、“启用/禁用”、“是/否”。为了提高可读性,您可以在JS数据模型中使用这些值对而不是布尔值。此外,此策略还允许添加其他状态(“NotSet”,用于对象中未配置某些内容的情况等)...

db2dz4w8

db2dz4w84#

我使用了01,而不是布尔类型。

相关问题